Arhn - архитектура программирования

Выберите из 4 таблиц с объединениями и IN

У меня 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  

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

29.07.2010

Ответы:


1

Используйте функцию 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
29.07.2010
  • Не работает :( В результате я вижу только один результат. Например, Åland Islands вместо Åland Islands, Equador, Russia. 29.07.2010
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..