#php #mysql #database #join
#php #mysql #База данных #Присоединиться
Вопрос:
Я обращаюсь к данным на своем сайте с помощью 3 запросов, первый запрос получает полный список предложений, доступных на сайте:
$listingquery = "SELECT * FROM table WHERE city = '$city' AND approved = '1'
AND enddate > NOW() ORDER BY id DESC";
следующий запрос получает количество / список доступных поставщиков сделок:
$providerquery = "SELECT programname, category, COUNT(name) FROM table WHERE
city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider";
и 3-й запрос получает количество / список категорий от доступных поставщиков услуг в этом городе:
$categoryquery = "SELECT programname, category, COUNT(name) FROM table WHERE
city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category";
есть ли способ объединить все это в 1 запрос?
Заранее спасибо!
Комментарии:
1. Есть что-то забавное в вашем втором запросе: вы имели в виду выбрать
provider
столбец вместоcategory
? Кроме того, вы не группируете поprogramname
ни во втором, ни в третьем запросе; MySQL допускает это, но может возвращать случайные результаты, если не гарантируется, что у каждого поставщика / категории будет только одно название программы.2. да, это была опечатка, поскольку я пытался выполнить 15 действий одновременно, сгруппированных по имени программы
Ответ №1:
Возможно, вы получите некоторую информацию без потерь, но вы можете попробовать это:
SELECT * FROM table a
LEFT JOIN (
SELECT programname, category, COUNT(name)
FROM table
WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY provider
) b ON a.provider = b.provider
LEFT JOIN (
SELECT programname, category, COUNT(name)
FROM table
WHERE city = '$city' AND approved='1' AND enddate > NOW() GROUP BY category
) c ON a.category = b.category
WHERE a.city = '$city' AND a.approved = '1'
AND a.enddate > NOW()
ORDER BY a.id DESC;
Обновите одним предложением Where (несколько):
SELECT * FROM table a
LEFT JOIN (
SELECT programname, category, COUNT(name)
FROM table
WHERE enddate > NOW() GROUP BY provider
) b ON a.provider = b.provider
LEFT JOIN (
SELECT programname, category, COUNT(name)
FROM table
WHERE enddate > NOW() GROUP BY category
) c ON a.category = b.category
WHERE a.city = '$city' AND a.approved = '1'
AND a.enddate > NOW()
AND b.city = a.city AND c.city = a.city
AND b.approved = a.approved AND c.approved = a.approved
ORDER BY a.id DESC;
Комментарии:
1. могу ли я присоединиться и разбить его там, где переменные WHERE определены только один раз? мне кажется излишним. Я все еще новичок в этом, поэтому пытаюсь как можно быстрее научиться правильному способу выполнения действий.
2. @Mike мое последнее обновление, возможно, не подходит. но в некоторых аспектах это правильно
3. должен ли я радикально изменять свой цикл while для извлечения данных? похоже, что для основных списков все работает нормально, категории / поставщики вообще не извлекают никаких данных.
Ответ №2:
Я сомневаюсь, что все это возможно / осуществимо в одном запросе, но в любом случае вам не следует использовать подзапрос в MySQL, это резко снизит производительность. Предпочитаю объединения вместо подзапроса.
Комментарии:
1. Я думаю, что моя терминология была неправильной. Ответ Нила кажется наиболее логичным для моего использования, просто пытаюсь заставить его работать сейчас 🙂