Как объединить два оператора count из двух таблиц в SQLITE?

#sql #sqlite #count #subquery #where-clause

#sql #sqlite #подсчет #подзапрос #where-предложение

Вопрос:

Я работаю над набором данных, связанным с приложением, похожим на Yelp и Tripadvisor. Я выполняю запросы в SQL. Мне нужно получить данные из двух разных таблиц. Мне нужно общее количество проверок и общее количество загруженных фотографий для каждого бизнеса. Одна таблица содержит photo_id, business_id, label и caption. Другой способ содержит business_id и date. Я написал запрос ниже, но он не извлекает общее количество регистраций и фотографий одновременно. Либо результаты отображаются как NONE.

     SELECT b.name, b.stars, b.review_count
   ,(SELECT COUNT (ch.business_id) AS total_checkin
    FROM checkin ch
    WHERE (ch.business_id = b.id) 
    GROUP BY ch.business_id) AS total_checkin

   ,(SELECT COUNT (photo.id) AS total_photos
    FROM photo
    WHERE (photo.business_id = b.id) AND (label = 'food')
    GROUP BY business_id) AS total_photos
    
    FROM business b
  

Комментарии:

1. NONE не является результатом SQL. Я предполагаю, что вы выполняете этот код через приложение Python. Итак, опубликуйте код Python, потому что, как и ваш запрос, он должен работать.

Ответ №1:

Ваш код должен работать, если структуры данных соответствуют описанным вами. Я бы, однако, предложил несколько изменений:

  SELECT b.name, b.stars, b.review_count,
    (
        SELECT COUNT(*)
        FROM checkin c
        WHERE c.business_id = b.id
    ) AS total_checkin,
    (
        SELECT COUNT(*)
        FROM photo p
        WHERE p.business_id = b.id AND p.label = 'food'
    ) AS total_photos
FROM business b
  

То есть:

  • нет необходимости в GROUP BY предложениях в подзапросах: это скалярные подзапросы, которые всегда возвращают одну строку (если на фото нет соответствующей проверки, вы получаете количество 0 )

  • нет необходимости указывать псевдоним count внутри подзапроса (псевдоним необходим только во внешнем запросе)

  • последовательно используйте псевдонимы таблиц

  • круглые скобки вокруг условий в WHERE предложении излишни