Как заказать 2 связанные таблицы в одном запросе с обоими полями заказа - PullRequest
1 голос
/ 05 апреля 2019

У меня есть 2 таблицы, первая из них - ПУНКТЫ, а другая - ГАЛЕРЕЯ (где у меня есть изображения каждого элемента), эти 2 таблицы связаны по item_id = item_gal_id.

В этих 2 таблицах2 важных поля, item_order (в ITEMS) и img_order (в GALLERY), которые я использую для упорядочивания элементов и изображений с помощью перетаскивания.

У меня нет проблем при заказе и выводе элементов в домашних условияхстраница с этим запросом:

SELECT * 
FROM items a 
LEFT JOIN gallery b ON (a.item_id = b.item_gal_id) 
WHERE a.it_public='SI' 
GROUP BY a.item_id, b.item_gal_id 
ORDER BY a.item_order ASC

НО ... каждый элемент показывает 1 (ОДИН) образ на главной странице, и это изображение не является тем, которое я предполагаю, я имею в виду, что я не могу вывестиизображение, которое находится на первом месте в порядке ГАЛЕРЕИ ...

Когда я нажимаю на один из пунктов, чтобы перейти на страницу сведений, легко отобразить изображения в нужном мне порядке, используя этот запрос:

SELECT * 
FROM gallery 
WHERE item_gal_id = (the item_id I send by GET) 
ORDER BY img_order ASC

Итак, как я могу показать список элементов, упорядоченных по item_order и, в том же запросе, чтобы показать изображение, которое является первым для этого элемента, имеющего img_order, есть ли способ сделать это?

Я искаля в течение 2 дней читаю без удачи, пробую несколько вариантов, но я действительно стекаюсь с этим.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Если вы просто хотите получить минимум item_gal_id для каждого item, то вы можете использовать простой JOIN с агрегацией.Это требует, чтобы вы явно перечислили столбцы из items, которые вы хотите отобразить (я предполагал item_id, col1 и col2).

SELECT i.item_id, i.col1, i.col2, MIN(g.item_gal_id)
FROM items i
LEFT JOIN gallery g ON i.item_id = g.item_gal_id
WHERE i.it_public = 'SI' 
GROUP BY i.item_id, i.col1, i.col2
ORDER BY i.item_order

Если вам нужна дополнительная информация из gallery чем просто item_gal_id, то одним из решений будет использование оконной функции ROW_NUMBER() (доступно только в MySQL 8.0):

SELECT * 
FROM (
    SELECT 
        i.item_id,
        i.item_order,
        i.col1, 
        i.col2, 
        g.item_gal_id, 
        g.col3, 
        g.col4,
        ROW_NUMBER() OVER(PARTITION BY i.item_id ORDER BY g.item_gal_id) rn
    FROM items i
    LEFT JOIN gallery g ON i.item_id = g.item_gal_id
    WHERE i.it_public = 'SI' 
) x 
WHERE rn = 1
ORDER BY item_order

Редактировать : на основекомментарии, здесь есть еще один вариант без оконных функций, использующий коррелированный подзапрос с условием NOT EXITS для фильтрации записи галереи с самым низким значением img_order.

SELECT i.*, g.*
FROM items i
LEFT JOIN gallery g ON i.item_id = g.item_gal_id
WHERE 
    i.it_public = 'SI' 
    AND NOT EXISTS (
        SELECT 1 
        FROM gallery g1 
        WHERE i.item_id = g1.item_gal_id AND g1.img_order < g.img_order
    )
ORDER BY i.item_order 
0 голосов
/ 05 апреля 2019

Вместо этого используйте подзапрос:

SELECT i.*,
       (SELECT g.item_gal_id
        FROM gallery g
        WHERE g.item_gal_id = i.item_id
        ORDER BY g.item_gal_id
        LIMIT 1
       ) as item_gal_id
FROM items i 
WHERE i.it_public = 'SI'
ORDER BY i.item_order ASC;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...