Как мне объединить несколько наборов результатов из цикла WHILE в запросе mySQL?

Это проблема, которая у меня есть в настоящее время.

У меня есть 7 таблиц данных о поездках. В настоящее время я выбираю случайным образом Card_ID из третьей таблицы, затем просматриваю все 7 таблиц с этим Card_ID и выбираю все записи, сделанные этим конкретным Card_ID.

Проблема в том, что генерируется много наборов результатов, и это создает проблемы, поскольку мне придется вручную экспортировать их один за другим. Можно ли как-то «автоматизировать» этот процесс, объединив около 2000 циклов записей WHILE в один набор результатов?

Заранее спасибо.

BEGIN
DECLARE counter INT;
DECLARE random INT;
DECLARE cardid VARCHAR(20);
SET counter = 1;

WHILE counter < 801 DO

    SET random = FLOOR(1 + (RAND() * 5451696));
    SET cardid = (SELECT CARD_ID FROM trips13042011 WHERE TripID = random);

    SELECT * FROM trips11042011 WHERE CARD_ID=cardid 
    UNION ALL
    SELECT * FROM trips12042011 WHERE CARD_ID=cardid
    UNION ALL
    SELECT * FROM trips13042011 WHERE CARD_ID=cardid
    UNION ALL
    SELECT * FROM trips14042011 WHERE CARD_ID=cardid    
    UNION ALL
    SELECT * FROM trips15042011 WHERE CARD_ID=cardid
    UNION ALL
    SELECT * FROM trips16042011 WHERE CARD_ID=cardid
    UNION ALL
    SELECT * FROM trips17042011 WHERE CARD_ID=cardid

    ORDER BY Ride_Start_Date, Ride_Start_Time ASC;

    SET counter = counter + 1;

end WHILE;
END

person EJ Chua    schedule 31.01.2013    source источник
comment
Может быть, временная таблица? Хотя, скорее всего, было бы исключить цикл ... но я не уверен, как это будет сделано в MySQL с помощью недетерминированной случайной функции. (Возможно, сгенерировать случайные числа — все 801 — сначала, а затем ПРИСОЕДИНИТЬСЯ?)   -  person    schedule 31.01.2013
comment
Если я правильно понял, у вас в настоящее время есть 2000-дневные таблицы ( tripsxxyyzzzz в формате dd-mm-zzzz -format ), и вы хотите создать ХРАНИМУЮ ПРОЦЕДУРУ, которая автоматически ищет все дневные таблицы и выполняет с ними запрос на объединение.   -  person Antti Rytsölä    schedule 31.01.2013
comment
Нашел это для справки: " title="создайте хранимую процедуру для перебора списка таблиц и их усечения"> stackoverflow.com/questions/4823550/   -  person Antti Rytsölä    schedule 31.01.2013
comment
@anttir Этот ответ выглядит так, как будто он использует SQL Server Переменные таблицы (они вроде как локальные временные таблицы) - я не уверен, что в MySQL есть такая конструкция.   -  person    schedule 31.01.2013
comment
Другой, для mysql: stackoverflow.com/a/4756624/468921 Измените строку в DECLARE c1, чтобы ограничить запрос только таблицы поездок и изменить запрос.   -  person Antti Rytsölä    schedule 31.01.2013
comment
привет @anttir, в настоящее время у меня есть около 800 таблиц / наборов результатов для каждого человека, представленного их идентификатором карты. Эти отдельные наборы результатов содержат записи за все 7 дней. Что я хотел бы сделать, так это объединить все эти 800 таблиц в 1 таблицу для удобного экспорта. Надеюсь, это разъяснение поможет.   -  person EJ Chua    schedule 31.01.2013


Ответы (1)


Я не знаком с языком, который вы используете (код сценария mySQL ??), но, насколько я понимаю, вы можете попробовать что-то вроде этого:

-Выполните цикл while, чтобы создать массив из 801 (или того, что вам нужно) случайных элементов. -Добавьте массив в предложение where -> WHERE CARD_ID IN (308, 3746, 72827, 1 и т. д.) до 801-го элемента вашего массива.

DECLARE rdmArray ARRAY;

WHILE counter < 801 DO
     SET random = FLOOR(1 + (RAND() * 5451696));
     SET cardid = (SELECT CARD_ID FROM trips13042011 WHERE TripID = random);
     rdmArray.push_back(cardid );
     SET counter = counter + 1;
end WHILE;

SELECT * FROM trips11042011 WHERE CARD_ID IN (//element of rdmArray here) 
UNION ALL
SELECT * FROM trips12042011 WHERE CARD_ID IN (//element of rdmArray here)
UNION ALL
SELECT * FROM trips13042011 WHERE CARD_ID IN (//element of rdmArray here)
UNION ALL
SELECT * FROM trips14042011 WHERE CARD_ID IN (//element of rdmArray here)   
UNION ALL
SELECT * FROM trips15042011 WHERE CARD_ID IN (//element of rdmArray here)
UNION ALL
SELECT * FROM trips16042011 WHERE CARD_ID IN (//element of rdmArray here)
UNION ALL
SELECT * FROM trips17042011 WHERE CARD_ID IN (//element of rdmArray here)

ORDER BY Ride_Start_Date, Ride_Start_Time ASC;

...

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

Надеюсь, это поможет!

Антуан

person antoine    schedule 31.01.2013
comment
привет, Антуан, поскольку я новичок в mySQL и просто использую это для своей дипломной работы за последний год, я пишу эту процедуру полностью в mySQL Workbench. Так что да, я считаю, что использую код сценария mySQL. - person EJ Chua; 31.01.2013