ORDER BY в GROUP_CONCAT и GROUP BY с объединенной таблицей - PullRequest
0 голосов
/ 21 ноября 2018

Сценарий:

У меня есть три таблицы.Одна таблица для поставщика , другая для категории , а последняя - таблица индекса .

Каждый поставщик может выбрать несколько категорий, которые будутзарегистрирован в таблице indexer.

Поле parent_id на indexer_table предназначено для регистрации идентификатора поставщика и child_id - это регистрация идентификатора категории.Есть еще одно поле с именем is_main , чтобы проверить, является ли это основной категорией поставщика.

Я работаю с этим запросом и работает очень хорошо.

SELECT 
    t1.id, t1.name, t1.company, t1.description,
    t2.categories, t2.categories_id 
        FROM supplier_table t1 
        LEFT JOIN (
            SELECT 
                tin2.parent_id, tin2.child_id, tin2.is_main,  
                GROUP_CONCAT(tin1.id) AS categories_id, 
                GROUP_CONCAT(tin1.title) AS categories FROM 
                (SELECT id, title FROM table_categories WHERE status = 1) tin1 
                    JOIN table_indexer tin2 ON tin2.child_id = tin1.id GROUP BY tin2.parent_id 
        ) t2 ON t1.id = t2.parent_id  
            WHERE t1.id IN (:id)

По сути, этот запрос возвращает всю необходимую мне информацию от поставщика.Идентификаторы и имена категорий: объединены на категории и Categories_id поля соответственно, и это сгруппирован по идентификатору поставщика (parent_id), давая мне такой вывод:

Supplier Object
(
    [id] => 1
    [name] => Supplier Name
    [company] => SUpplier Company Name
    [description] => Supplier Description Text.
    [categories] => Category Example 1,Main Category,Category Example 2
    [categories_id] => 6,9,5
)

Мне нужно ЗАКАЗАТЬ is_main DESC содержимое GROUP_CONCAT .Таким образом, я бы знал, что первое вхождение - это основная категория поставщика.

Supplier Object
(
    [id] => 1
    [name] => Supplier Name
    [company] => SUpplier Company Name
    [description] => Supplier Description Text.
    [categories] => Main Category,Category Example 1,Category Example 2
    [categories_id] => 9,6,5
)

Я пытался разместить ORDER BY после GROUP BY и в некоторых других местах, но это не сработало.Спасибо за любую помощь, спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

Если я вас понимаю, вам нужно упорядочить содержимое результатов Group_Concat, а не строки, в которых они находятся. Для этого вам нужно добавить порядок как часть Group_Concat. Здесь руководствоВ том же порядке, что и в заголовке, вам нужно будет установить одинаковый порядок сортировки для обоих конкатов и убедиться, что они дают гарантированный порядок, возможно, путем расширения порядка сортировки для включения идентификатора, например:

GROUP_CONCAT(tin1.id ORDER BY tin2.is_main DESC, Tin2.ID) AS categories_id,
GROUP_CONCAT(tin1.title ORDER BY tin2.is_main DESC, Tin2.ID) AS categories

Вы можете использовать заголовок в качестве второго порядка, если вы можете гарантировать, что заголовки всегда будут разными.

...