Как запросить несколько таблиц в mysql

#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';
  

Это часто имеет лучшую производительность, чем запрос, использующий агрегацию.