2015-10-28 3 views
1

Я пытаюсь создать запрос, который будет выводить определенную строку несколько раз. Скажем, вывести строку 6 раз. Я проверил другие вопросы, которые касаются этого, но не получил ни одного, который наилучшим образом отвечает на мой вопрос.
Вот мой вопрос.Лучший способ повторить запросы вместо UNION ALL?

SELECT * FROM table WHERE id=1 
UNION ALL 
SELECT * FROM table WHERE id=1 
UNION ALL 
SELECT * FROM table WHERE id=1 
UNION ALL 
SELECT * FROM table WHERE id=1 
UNION ALL 
SELECT * FROM table WHERE id=1 
UNION ALL 
SELECT * FROM table WHERE id=1 

Этот метод будет работать для небольшого количества повторений. Теперь мой вопрос: есть ли лучший (или стандартный) способ сделать это, который также будет работать для больших повторений?

Если на этот вопрос был дан ответ, любезно снимите ссылку, и я отдам ее.

Ваша помощь будет принята с благодарностью.

+0

Почему вы хотите повторений? если вы действительно хотите, чтобы затем дублировать их в таблице для выбора. –

+0

Я хочу использовать деталь по умолчанию для заполнения * пустых * слотов. Действительно ли я должен дублировать их, если они до 100 или 200? Моя основная цель - поддерживать один и тот же идентификатор по всему запросу. –

+0

Отправьте ваши таблицы (примеры) и ожидаемый результат. Может быть, это может прояснить вашу задачу. –

ответ

1

способ сделать это - независимо от количества строк, которые вы хотите иметь, вы можете сделать таблицу номеров, которую вы выбираете, и присоединить свой идентификатор + количество строк, которые вы хотите дублировать. как так

SELECT e.* 
FROM example e 
JOIN 
( SELECT 
     seq.s as digit 
    FROM 
    ( SELECT (hundreds.s + tens.s + ones.s) s 
     FROM(SELECT 0 s UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ones 
     CROSS JOIN(SELECT 0 s UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) tens 
     CROSS JOIN(SELECT 0 s UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900) hundreds 
    ) seq 
) n ON e.id + 5 > n.digit 
WHERE e.id = 1 

FIDDLE

Проблема с предыдущим SQL скрипкой я отправил (в комментариях), это вы должны иметь достаточное количество записей в таблице, чтобы вытащить точные дубликаты записей .. таким образом, вы получите то, что хотите каждый раз.

ПРИМЕЧАНИЕ: это на самом деле. Я бы высоко рекомендую вам не запускать этот запрос все время. если вам действительно нужна таблица чисел, тогда создайте ее и вставьте эти значения один раз. затем просто присоединитесь к таблице.

если вы должны идти по этому пути (дублирование записей в MySQL), то это то, что я хотел бы сделать

CREATE TABLE digits (id INT); 
INSERT INTO digits (id) 
SELECT 
    seq.s as digit 
FROM 
( SELECT (hundreds.s + tens.s + ones.s) s 
    FROM(SELECT 0 s UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) ones 
    CROSS JOIN(SELECT 0 s UNION ALL SELECT 10 UNION ALL SELECT 20 UNION ALL SELECT 30 UNION ALL SELECT 40 UNION ALL SELECT 50 UNION ALL SELECT 60 UNION ALL SELECT 70 UNION ALL SELECT 80 UNION ALL SELECT 90) tens 
    CROSS JOIN(SELECT 0 s UNION ALL SELECT 100 UNION ALL SELECT 200 UNION ALL SELECT 300 UNION ALL SELECT 400 UNION ALL SELECT 500 UNION ALL SELECT 600 UNION ALL SELECT 700 UNION ALL SELECT 800 UNION ALL SELECT 900) hundreds 
) seq 

теперь у вас есть цифра таблица просто присоединиться на ней

SELECT e.* 
FROM example e 
JOIN digits d ON e.id + 5 < d.id 
WHERE e.id = 1 
+0

Спасибо и отметили! –

+0

Означает ли это, что у меня будет дубликат записи в mysql? Если да, я не думаю, что я действительно хочу это сделать. Вот сделка: у меня есть таблица, где хранятся все данные объявления (id, title, img_url, ad_url, status), и у меня уже есть функция, которая будет запрашивать БД и получать объявления, статус которых активен, а затем отображать их в слоте рекламы. Я действительно хочу получить баннер по умолчанию, который также находится в БД с id = 1, если один или несколько слотов объявлений пусты (например, если объявление было отключено). Будет ли еще необходимо создать дубликат записи? –

+0

Как я уже говорил, вы должны сделать это на другом языке программирования –

1

сделать одноразовое создание таблицы с большим количеством чисел из 1-n, затем использовать ее для «генерации» в качестве диапазона чисел и присоединения к этому диапазону.

Вот простой способ создания и заполнения таблицы:

create table numbers (number int not null primary key auto_increment); 
insert into numbers() values(); 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 
insert into numbers select null from numbers; 

Этот код заполнит таблицу с номерами 1-1024. Каждое дополнительное исполнение insert into numbers select null from numbers удваивает количество строк.

Теперь присоединиться, скажем, в 100 раз:

select table.* from table 
join numbers on number <= 100 
where id = 1 

Вы можете, конечно, параметризацию значения 100 в качестве параметра запроса, что означает у вас есть один запрос о том, как когда-либо количество строк, вам нужно во время выполнения.

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

Смежные вопросы