Подтвердить что ты не робот

Mysql fake select

Моя цель: получить несколько строк из списка значений, например (1,2,3,4,5), ('a', 'b', 'c', 'anything') и так далее.

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)

Вышеупомянутый sql, конечно, хорошо, но мой вопрос: есть ли способ получить тот же результат без

указание таблицы? Поскольку моя цель здесь - просто распространять строки с помощью id_set

другой пример:

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

mysql>

Этот пример передал результат одной строки без указания таблицы,

но как распространять несколько строк из строки типа (1,2,3,4,5,6)?

4b9b3361

Ответ 1

Что-то вроде этого должно работать:

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

Ответ 2

В MySQL есть фиктивная таблица: DUAL. но использование DUAL ничего не меняет (это просто для удобства) и, конечно же, не делает этот запрос работать.

Я уверен, что есть лучший способ добиться того, что вы пытаетесь сделать. Мы могли бы помочь, если вы объясните свою проблему.

Ответ 3

Это точно не отвечает на ваш вопрос, но я считаю, что это исправит вашу актуальную проблему.

SET @counter = 0;  SELECT (@counter: = @counter + 1 в качестве счетчика)... остальная часть вашего запроса

Ответ 4

Один из методов, который я нашел неоценимым, "таблица целых чисел" , который позволяет вам легко выполнять всевозможные аккуратные вещи, в том числе этот (xaprb написал несколько сообщений в блоге по этой технике и тесно связанную "таблицу мьютексов" ).

Ответ 5

Простым и старомодным способом является использование таблицы, которая содержит последовательные значения.

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);

После установки вы можете писать запросы, как показано ниже.

получить каждую вторую строку:

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

получить строки от 1101 до 1111:

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

Итак, если вам нужны большие диапазоны, просто увеличьте размер последовательных значений в таблице 10. Запрос простой, стоимость низкая, нет хранимой процедуры или функции.

Примечание:

Вы также можете создать таблицу с последовательными значениями char. Но изменять содержимое было бы не так просто.