Выберите из 4 таблиц с объединениями и IN - PullRequest
0 голосов
/ 29 июля 2010

У меня 5 столов.
Первый products как:

id | country_ids | category_ids | users_ids  
1  | 1,4,6       |  4,5,6,70    | 5,6,9  
2  | 5,6,3       |  4,8,2,11    | 1,5,8  

Второй countries как:

c_id | c_name  
1  | Åland Islands  
2  | Antarctica  
...  

Третий categories как:

cat_id | cat_name  
2  | Small  
4  | Large    
...  

Четвертый стол users как:

u_id | u_name  
1  | David  
2  | Mary    
...  

И пятая таблица review (структура таблицы не важна, только идентификатор счета).

и sql

    SELECT a.*, COUNT(b.comm_id) AS comm_count, c.*, d.*, e.*
    FROM products AS a
    LEFT JOIN comments AS b ON b.comm_prod_id = a.id AND b.comm_published = 1
    LEFT JOIN countries AS c ON c.c_id IN (a.country_ids)
    LEFT JOIN categories AS d ON d.c_id IN (a.category_ids)
    LEFT JOIN users AS e ON e.c_id IN (a.users_ids)
    /*WHERE published = 1*/
    GROUP BY id
    ORDER BY id DESC
    LIMIT 0, 5

Но этот запрос возвращает только первое значение для объединенных таблиц.

Как я могу получить строку, как

1 | Åland Islands, Equador, Russia | Small, tiny, large, ... | Anna, John, Linda  

PS! Или мне нужно создать отношения таблицы для каждой таблицы? Что очень не нравится.

1 Ответ

0 голосов
/ 29 июля 2010

Использовать функцию GROUP_CONCAT ():

SELECT 
    a.id, 
    GROUP_CONCAT(DISTINCT c_name) AS country_names, 
    GROUP_CONCAT(DISTINCT cat_name) AS cat_names, 
    GROUP_CONCAT(DISTINCT u_name) AS user_names, 
    COUNT(DISTINCT b.comm_id) AS comm_count
FROM products AS a
LEFT JOIN comments AS b ON b.comm_prod_id = a.id AND b.comm_published = 1
LEFT JOIN countries AS c ON c.c_id IN (a.country_ids)
LEFT JOIN categories AS d ON d.c_id IN (a.category_ids)
LEFT JOIN users AS e ON e.c_id IN (a.users_ids)
/*WHERE published = 1*/
GROUP BY id
ORDER BY id DESC
LIMIT 0, 5

Обновление: О, чувак, у тебя в таблице список через запятую. Это отстой.
Прочитайте о нормализации и создайте таблицы отношений со структурой product_comments (product_id, comment_id), product_countries (product_id, country_id) и сохраните каждое отношение в отдельной строке.

Пример данных:

product_countries  
product_id, country_id  
1, 1
1, 4
1, 6
2, 5
2, 6
2, 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...