Создание сетки данных с php / mysql - объединение запросов? - PullRequest
2 голосов
/ 19 ноября 2010

Я пытаюсь создать сетку доступности из нескольких таблиц, чтобы представить информацию следующим образом:

------------------------------------------------------
venue      |  22/11 |  23/11 | 24/11 | 25/11 | 26/11 |
------------------------------------------------------
Some venue |   £24  |   £25  |  £32  |  N/A  |  £65  |
------------------------------------------------------
Some venue |   £20  |   N/A  |  £22  |  £34  |  £43  |
-------------------------------------------------------

Для каждого места я могу создать набор записей для выбранного периода даты, используя запрос, такой как:

SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 7
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate;

Ключевым моментом здесь является то, что я могу вернуть нулевое значение для любых дат, которые недоступны, сохраняя при этом мой набор записей на правильное количество дней (т.е. 5 записей для рабочей недели).

Чтобы добавить все остальные места в этот список, я рассматривал простое использование запроса UNION для объединения наборов данных в один, например, так:

(SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 7
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate)
UNION
(SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId = 8
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate);

Меня беспокоит, скажем, 10 различных мест, к которым можно было бы обратиться, тогда запрос может пройти довольно долго.

Итак, мой вопрос заключается в следующем: является ли запрос UNION моей единственной опцией здесь или есть какой-то альтернативный JOIN, который я могу использовать, чтобы получить полные недели результатов для всех запрашиваемых мест.

Надеюсь, это понятно: -S

EDIT:

Чтобы указать, что я хочу, ниже приведены скриншоты требуемого набора записей и текущего запроса:

alt text

alt text

Использование IN () как предложено: alt text

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010
SELECT  td.query_date, a.venueId
FROM    temp_date td
CROSS JOIN
        (
        SELECT  7 AS id
        UNION ALL
        SELECT  8 AS id
        ) ids
LEFT JOIN
        availability a
ON      a.date = td.query_date
        AND a.id = ids.id
ORDER BY
        ids.id, td.query_date

Также обратите внимание, что GROUP BY не является правильным методом для обработки дубликатов: на самом деле ваш запрос будет зависать в любой другой системе, кроме MySQL, и даже в MySQL с ANSI * 1006.* поведение включено.

Возможны ли дубликаты на (date, id) в availability?Если да, какой из этих дубликатов следует выбрать?

1 голос
/ 19 ноября 2010

Почему бы не использовать IN ()?

SELECT temp_date.queryDate, availability.venueId
FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId IN(7, 8)
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate
0 голосов
/ 19 ноября 2010

Да, определенно, как описывает Webnet, вы можете использовать оператор IN для выбора идентификатора места встречи.

SELECT temp_date.queryDate, availability.venueId

FROM temp_date
LEFT JOIN availability
ON temp_date.queryDate = availability.date
AND availability.venueId IN(7, 8)
GROUP BY temp_date.queryDate
ORDER BY temp_date.queryDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...