Сгруппировать, не получив ожидаемых результатов в mysql - PullRequest
0 голосов
/ 13 марта 2020

У меня следующий запрос:

SELECT DISTINCT
    bt.name, b.id
FROM
    ports po,
    cities c,
    provinces p,
    countries co,
    states s,
    translations t,
    element_types et,    
    languages l,
    boat_models bm, 
    boat_types bt,
    boats b
        JOIN
    boat_prices bprf ON b.id = bprf.boat_id
        AND bprf.checkin_date IS NULL
        AND bprf.duration_id IS NULL
WHERE
    t.element_translation = 'España'
    AND et.name = 'Country'
    AND s.name = 'confirmed'    
    AND s.id = b.state_id
    AND l.locale = 'es'
    AND t.language_id = l.id
    AND t.element_type_id = et.id
    AND t.element_id = p.country_id        
        AND c.province_id = p.id        
        AND po.city_id = c.id
        AND b.port_id = po.id
        AND bm.id = b.boat_model_id 
        AND bt.id = bm.boat_type_id 

Это работает отлично и возвращает 9 строк:

'BOAT_TYPE_CATAMARAN','13707'
'BOAT_TYPE_SAILBOAT','13700'
'BOAT_TYPE_SAILBOAT','13701'
'BOAT_TYPE_SAILBOAT','13702'
'BOAT_TYPE_SAILBOAT','13703'
'BOAT_TYPE_SAILBOAT','13704'
'BOAT_TYPE_SAILBOAT','13705'
'BOAT_TYPE_SAILBOAT','13706'
'BOAT_TYPE_SAILBOAT','13708'

Я хочу сгруппировать результаты по типу лодки и получить число лодки для каждого типа.

Однако, когда я делаю:

SELECT DISTINCT
    bt.name, COUNT(b.id) AS num_boats
FROM
    ports po,
    cities c,
    provinces p,
    countries co,
    states s,
    translations t,
    element_types et,    
    languages l,
    boat_models bm, 
    boat_types bt,
    boats b
        JOIN
    boat_prices bprf ON b.id = bprf.boat_id
        AND bprf.checkin_date IS NULL
        AND bprf.duration_id IS NULL
WHERE
    t.element_translation = 'España'
    AND et.name = 'Country'
    AND s.name = 'confirmed'    
    AND s.id = b.state_id
    AND l.locale = 'es'
    AND t.language_id = l.id
    AND t.element_type_id = et.id
    AND t.element_id = p.country_id        
        AND c.province_id = p.id        
        AND po.city_id = c.id
        AND b.port_id = po.id
        AND bm.id = b.boat_model_id 
        AND bt.id = bm.boat_type_id 
GROUP BY bt.name
ORDER BY bt.name

Я получаю:

'BOAT_TYPE_CATAMARAN','241'
'BOAT_TYPE_SAILBOAT','1928'

, но в соответствии с первым запросом, я ожидаю

'BOAT_TYPE_CATAMARAN','1'
'BOAT_TYPE_SAILBOAT','8'

Чего мне не хватает?

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

Я подозреваю, что вы хотите:

SELECT bt.name, COUNT(DISTINCT b.id) AS num_boats
FROM ...
WHERE ...
GROUP BY bt.name
ORDER BY bt.name

То есть: перемещайте DISTINCT в COUNT(), а не непосредственно в SELECT.

Вообще говоря, DISTINCT и GROUP BY не go вместе хорошо; DISTINCT уже по сути является агрегацией, поэтому смешивание обоих обычно не имеет значения.

Обратите внимание, что в вашем синтаксисе используются неявные объединения старой школы (с запятой в предложении FROM): вы должны использовать стандартные объединения (с ключевым словом ON), синтаксис которых был последним на протяжении десятилетий.

0 голосов
/ 13 марта 2020

Вы делаете отчет в своем первом запросе, поэтому вы «прячете» много, если строки удваиваются из-за вашего соединения.

...