#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
предложении излишни