Question mysql fake select


Mon but est: d'obtenir plusieurs lignes d'une liste de valeurs, comme (1,2,3,4,5), ('a', 'b', 'c', 'n'importe quoi') et ainsi de suite.

mysql> select id from accounts where id in (1,2,3,4,5,6);
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  5 |
|  6 |
+----+
5 rows in set (0.00 sec)

Le SQL ci-dessus est correct, mais ma question est la suivante: y a-t-il un moyen d'obtenir le même résultat sans

spécifiant une table? Parce que mon but ici est juste de propager des lignes par un id_set

un autre exemple:

mysql> select now() as  column1;
+---------------------+
| column1             |
+---------------------+
| 2009-06-01 20:59:33 |
+---------------------+
1 row in set (0.00 sec)

mysql>

Cet exemple a propagé un résultat sur une seule ligne sans spécifier de table,

mais comment propager plusieurs lignes à partir d'une chaîne comme (1,2,3,4,5,6)?


22
2018-06-02 01:03


origine


Réponses:


Quelque chose comme ça devrait fonctionner:

SELECT *
FROM (
    SELECT 0 as id
    UNION SELECT 1
    UNION SELECT 2
    UNION SELECT 3
    UNION SELECT 4
    UNION SELECT 5
)

24
2018-06-02 01:13



MySQL a une table factice: DUAL. mais utiliser DUAL ne change rien (c'est juste pour plus de commodité), et ne fait certainement pas fonctionner cette requête.

Je suis sûr qu'il existe un meilleur moyen de réaliser ce que vous essayez de faire. Nous pourrions peut-être vous aider si vous expliquez votre problème.


6
2018-06-02 01:14



Cela ne répond pas exactement à votre question, mais je pense que cela résoudra votre problème actuel.

SET @counter = 0;    SELECT (@counter: = @counter + 1 comme compteur) ... reste de votre requête


1
2018-06-02 01:15



Une technique que j'ai trouvée inestimable est une "table d'entiers", ce qui vous permet de faire facilement toutes sortes de choses intéressantes, y compris celle-ci (xaprb a écrit plusieurs articles de blog sur cette technique et la "table de mutex" étroitement liée).


0
2018-06-02 01:18



Une méthode simple et ancienne consiste à utiliser une table contenant des valeurs consécutives.

DROP TABLE IF EXISTS `range10`;
CREATE TABLE IF NOT EXISTS `range10` (
  `id` int(11) NOT NULL,
  KEY `id` (`id`)
) ENGINE=MyISAM;
INSERT INTO `range10` (`id`) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

Une fois installé, vous pouvez écrire des requêtes comme indiqué ci-dessous.

obtenez chaque seconde rangée:

select * from your_data_table where id in (
 SELECT id*2 as id FROM `range10` WHERE id in(
  select id from `range10`
 )
)

obtenir des lignes de 1101 à 1111:

select * from your_data_table where id in (
 SELECT id+1100 as id FROM `range10` WHERE id in(
  select id from `range10`
 )
)

Donc, si vous avez besoin de plus grandes plages, augmentez simplement la taille des valeurs consécutives dans la plage de la table10. L'interrogation est simple, le coût est faible, aucune procédure ou fonction stockée n'est requise.

Remarque:

Vous pouvez également créer une table avec des valeurs de caractère consécutives. Mais varier le contenu ne serait pas si facile.


0
2017-08-20 08:01