присоединение к подзапросам mysql

#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. Я думаю, что моя терминология была неправильной. Ответ Нила кажется наиболее логичным для моего использования, просто пытаюсь заставить его работать сейчас 🙂