Подсчитывать строку в table2 на основе table1 с помощью подготовленного оператора

#mysql

#mysql

Вопрос:

У меня есть 2 таблицы:

clients_db

 | clnt_id | clnt_sid | usr_sid | clnt_name |
|    1    | 12345678 |  10001  |   Peter   |
|    2    | 87654321 |  10001  |   Mikey   |
  

aircon_client_db

 |  ac_id  | clnt_sid |
|    1    | 12345678 |
|    2    | 12345678 |
|    3    | 12345678 |
|    4    | 87654321 |
|    5    | 87654321 |
  

Это запрос:

 select *,count(air.ac_id) as nAC
from clients_db clnt 
left join aircon_client_db air on air.clnt_sid=clnt.clnt_sid
where clnt.usr_sid=? 
group by clnt.clnt_sid
order by clnt.clnt_name asc
  

Из приведенного выше кода. Я ожидаю результат clnt_id[1]=3 и clnt_id[2]=2 . Но результат возвращается 0 для всех. Где я должен исправить?

Ответ №1:

Вам просто нужно выбрать count(air.ac_id) .

Также замените clnt.usr_sid=? на clnt.clnt_id=? , если вы собираетесь ожидать результата, подобного clnt_id[1]=3 .

 select count(air.ac_id) as nAC
from clients_db clnt 
left join aircon_client_db air on air.clnt_sid=clnt.clnt_sid
where clnt.clnt_id=?
group by clnt.clnt_sid
order by clnt.clnt_name asc
  

Вам не хватает clnt_name столбца as в вашем вопросе?

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

1. Да, я забыл этот столбец, теперь исправлено! Но все еще не работает. Это не подсчитывается; (

2. Пожалуйста, посмотрите этот пример, основанный на вашем db-fiddle.com/f/gy4GHUUbZQRqHdKfDEJaVR/0 , отправленный мной запрос работает так, как ожидалось.

3. Но когда я изменил причину where clnt.usr_sid=10001 … ошибка!

4. Вы можете упорядочивать только по столбцам, появляющимся в GROUP BY предложении или агрегатах. Действительно ли порядок по полезен для вас?

5. order by Здесь на самом деле не имеет значения. Но как только я его удалю. Ничего не меняется;(

Ответ №2:

Не используйте * , но явное имя столбца или в этом случае вы также можете использовать clnt.* (вам не нужно значение для таблицы с левым присоединением, а только count(*)

 select clnt.clnt_id, clnt.clnt_sid  ,count(air.ac_id) as nAC
from clients_db clnt 
left join aircon_client_db air on trim(air.clnt_sid)=trim(clnt.clnt_sid)
AND  trim(clnt.user_sid)= '10001'
group by clnt.clnt_sid
order by clnt.clnt_name asc
  

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

1. ответ уже обновлен .. добавить .псевдоним имени таблицы clnt.cln_sid

2. Похоже, мне нужно добавить ко всему столбцу префикс clnt или у меня ошибка : 'Column 'clnt_sid' in field list is ambiguous'

3. Кстати, после того, как я поставил clnt впереди. Это все еще не учитывается, как ожидалось. : (

4. к какому типу данных относятся столбцы cln_sid в обеих таблицах

5. может быть, ваш входной параметр не соответствует значению столбцов для соединения, которое не соответствует