2015-06-29 3 views
0

У меня есть две таблицы, как complaints и attachmentsMySQL левое соединение со счетом из правой таблицы, включая нулевую

Я хочу, чтобы перечислить все жалобы вместе с их подсчетом вложений (только подсчитывает). Если записей не найдено из правой таблицы (attachments), то 0 в качестве количества подключений.

Я использую этот запрос,

SELECT c.*, IFNULL(COUNT(p.pic_id), 0) FROM complaints c 
LEFT JOIN attachments p 
ON c.compl_id = p.compl_id 
ORDER BY comp_date DESC 

Но это просто возвращает, что строки, которые присутствуют в правой таблице (attachments таблицы). Я просто хочу перечислить все строки из таблицы complaints вместе с соответствующим количеством подключений (если не считать 0).

Таблицы:

complaints 
============ 
compl_id 
cust_id 
cust_msg 
comp_date 

attachments 
============ 
pic_id 
compl_id 

EDIT:

complaints 
=============== 
comp1 cust1 abcd 1/1/2015 
comp2 cust5 hey  1/1/2015 
comp3 cust60 hello 1/1/2015 

attachments 
=============== 
a_34554sdfs  comp2 
1_idgfdfg34  comp2 

Я хочу иметь результаты, как это,

comp1 cust1 abcd 1/1/2015 0 
comp2 cust5 hey  1/1/2015 2 
comp3 cust60 hello 1/1/2015 0 

Но в настоящее время, я получаю результат, как это,

comp2 cust5 hey  1/1/2015 2 
+2

Агрегатная функция без 'группы by'? –

+0

Жаль, что я новичок в Joins. Я много искал, но не мог заставить его работать. –

+1

В этом случае вам необходимо предоставить некоторые данные образца и ожидаемый результат. –

ответ

2

Думаю, вам просто нужна группа, чтобы получить желаемые результаты. MySQL расширяет агрегированные функции, чтобы не требовать группу. Однако, если вы не знаете, как использовать эту функцию, вы, скорее всего, получите неправильные результаты большую часть времени. Единственный раз, когда действительно использовать его, - это когда все значения в столбце одинаковы; в чем я сомневаюсь.

SELECT compl_ID, cust_ID, cust_msg, comp_date, coalesce(count(Pic_ID),0) as Attach_Count 
FROM complaints C 
LEFT JOIN attachments A 
on C.compl_ID = A.Compl_ID 
GROUP BY compl_ID, cust_ID, cust_msg, comp_date 
+0

'GROUP BY compl_id' помог ему сработать. Благодарю. –

+0

Могу я просто использовать 'GROUP BY compl_id' безопасно вместо' GROUP BY compl_ID, cust_ID, cust_msg, comp_date'. PS: В таблице жалоб в списке жалоб есть первичный ключ. –

+0

[Сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются неопределенными.] (Https://dev.mysql.com/doc/refman/5.0/en/group-by -handling.html) Итак, вы готовы принять неопределенные значения для других столбцов, которые вам действительно нужно группировать по каждому из них. Итак, да синтаксически вы можете, но вы получите неопределенные результаты, если значения в столбце меняются; которые на основе вашего дела они ... так что пока вы можете это сделать ... вы не должны, если вы не хотите, чтобы в некоторых столбцах были неправильные значения. – xQbert

0

Вы можете попробовать это, удаление IFNULL:

SELECT c.*, COUNT(p.pic_id) 
FROM complaints c 
LEFT JOIN attachments p 
ON c.compl_id = p.compl_id 
ORDER BY comp_date DESC 
+0

Поскольку автор использует агрегированную функцию «COUNT», оператор «GROUP BY» должен быть добавлен в запрос. – RhinoLarva

0

что вы хотите:

SELECT c.*, COUNT(c.compl_id) AS count 
FROM complaints c 
INNER JOIN attachments a USING(compl_id) 
GROUP BY c.compl_id; 
Смежные вопросы