2014-01-18 2 views
0

QueryMySQL COUNT возвращает больше значения, чем когда фактические результаты вытягиваются

SELECT DISTINCT walls.wall_id FROM walls 
LEFT JOIN wall_categories ON walls.wall_id = wall_categories.wall_id 
LEFT JOIN wall_devices ON walls.wall_id = wall_devices.wall_id 
WHERE wall_categories.category_id IN (1,2,3) 
AND wall_devices.device_id IN (1,2,3) 
AND walls.wall_id>113; 

выше запрос возвращает результат ниже:

enter image description here

и если добавить COUNT в том же запросе, как:

SELECT DISTINCT COUNT(walls.wall_id) FROM walls 
LEFT JOIN wall_categories ON walls.wall_id = wall_categories.wall_id 
LEFT JOIN wall_devices ON walls.wall_id = wall_devices.wall_id 
WHERE wall_categories.category_id IN (1,2,3) 
AND wall_devices.device_id IN (1,2,3) 
AND walls.wall_id>113; 

возвращается = 14

enter image description here

где может быть проблема? Что я делаю не так?

+0

Обратите внимание, что '' WHERE' делает ЛЕВЫЙ JOIM wall_categories' как 'ВНУТРЕННЕЙ JOIN' – Strawberry

ответ

2

Вы хотите:

SELECT COUNT(DISTINCT walls.wall_id) 

Когда вы пишете:

SELECT DISTINCT <expr>, <expr>, <expr>, ... 

это эффективно делает запрос, как если бы не было DISTINCT модификатора, а затем удаляет все дубликаты из результирующего набора. Поэтому, когда Вы писали:

SELECT DISTINCT COUNT(walls.wall_id) 

он просто сделал нормальный подсчет всех wall_id строк, которые удовлетворяют критерии, в остальной части запроса .. Это просто возвращает результат, который является общим количеством строк, а затем DISTINCT удаляет любые дубликаты, что тривиально, поскольку это всего лишь один результат.

Когда вы помещаете модификатор DISTINCT внутри COUNT(), он сообщает, что функция должна удалять дубликаты во время подсчета.

+0

совершенной! большое спасибо! – vephelp

1

попробовать это:

SELECT COUNT(DISTINCT walls.wall_id) FROM walls 
LEFT JOIN wall_categories ON walls.wall_id = wall_categories.wall_id 
LEFT JOIN wall_devices ON walls.wall_id = wall_devices.wall_id 
WHERE wall_categories.category_id IN (1,2,3) 
AND wall_devices.device_id IN (1,2,3) 
AND walls.wall_id>113; 
Смежные вопросы