#mysql #sql #jdbc
#mysql #sql #jdbc
Вопрос:
Я пытаюсь запросить три таблицы, и мои структуры таблиц выглядят следующим образом
Table 1: info table
id name pincode
1 Lele 560099
2 John 560099
3 Marium 560077
Table 2: area table
id area pincode
1 Nagar 560099
Table 3: Region table
id area latitude longitude
1 Nagar 10.23456 10.9865
Теперь я пытаюсь получить количество пользователей, которое остается в Nagar, и вместе с этим я пытаюсь получить широту и длину этой области. Ожидаемый результат должен быть
usersCount areaName pincode lat long
2 Nagar 560099 10.23456 10.9865
До сих пор я пробовал следующий запрос:
select
count(distinct info.id)as usersCount,
area.area as area_name,
are.pincode as pincode,
region.latitude as latitude,
region.longitude as longitude
from
info, area, region
where
area.area = "Nagar"
Приведенный выше запрос дает мне пустой вывод.
Я не уверен, где я ошибаюсь в этом запросе. Любая помощь будет оценена.
Комментарии:
1. Совет сегодняшнего дня: всегда используйте современный, явный
JOIN
синтаксис! Проще писать ( без ошибок ), легче читать и поддерживать, а также легче преобразовывать во внешнее соединение, если это необходимо.
Ответ №1:
Вы пропустили критерии объединения между таблицами и group by для подсчета пользователей:
SELECT count() as usersCount, r.areaName, a.pincode, r.lat, r.long
FROM region r
INNER JOIN area a on a.area = r.areaName
INNER JOIN info i on i.pincode = a.pincode
WHERE area.area = 'Nagar'
GROUP BY r.areaName, a.pincode, r.lat, r.long
Комментарии:
1. что-то не так с вашими данными? например, ‘Nagar’ (пробел) вместо ‘Nagar’. Является ли пинкод дважды одним и тем же типом данных? Что, если вы протестируете объединение только региона и области.
2. Да, Pincode имеет одинаковый тип данных в обеих таблицах, если это то, что вы спрашиваете?
3. и является ли ‘Nagar’ одинаковым в обеих таблицах. Если вы не получаете ошибку SQL, а просто пустой результат, и все ваши таблицы содержат правильные данные, запрос должен возвращать значения. Итак, проверьте ваши условия соединения одно за другим.
4. ‘Nagar’ одинаковый в обоих местах и не выдает ошибку. Но результат получается пустым
5. Это может показаться глупым, но вы тестировали простое
select * from area
,select * from region
иselect * from info
? Я думаю, что ваша проблема не связана с самим запросом.
Ответ №2:
Возможно, вам будет полезен связанный подзапрос:
select r.*,
(select count(*)
from area a join
info i
on i.pincode = a.pincode
where a.area = r.areaname
) as cnt
from region r
where name 'Nagar';
Это часто имеет лучшую производительность, чем запрос, использующий агрегацию.