СОВМЕСТНЫЙ запрос MySQL и LIMIT - PullRequest
2 голосов
/ 14 февраля 2012

Это мой первый пост на этом форуме (поэтому, пожалуйста, будьте осторожны)

Я работаю над огромной базой данных продуктов, и у меня есть много таблиц информации о них.

Существует одна таблица, которая выглядит следующим образом:

продукт

  • product_id
  • имя
  • бренд

И еще одна таблица с разными типами одного и того же продукта, которая выглядит следующим образом:

product_type

  • type_id
  • тип
  • Расходы
  • product_id

Я использую объединение для выбора обеих таблиц, и он отлично работает, но, поскольку в обеих таблицах более тысячи записей, я хочу ограничить выбор и показать только 15 записей на странице.

Итак, моя проблема:

Я выбираю две объединенные таблицы и ограничиваю их 15. Но поскольку существует больше типов, чем продуктов, я выбираю 15 типов продуктов, которые принадлежат к неизвестному количеству продуктов (поскольку один продукт может иметь 1, 2 или любое количество типов) , Мне нужно иметь возможность выполнять поиск в обеих таблицах и упорядочивать результаты в соответствии со столбцами из обеих таблиц, а также нецелесообразно просто выбирать 15 записей из продуктов и одну запись из product_types для каждого, потому что мне нужны все типы для отображения ...

Так вы можете мне помочь, что мне делать? Я как бы застрял с этим. (Надеюсь, мое описание понятно)

1 Ответ

2 голосов
/ 14 февраля 2012

Есть несколько способов добиться этого. Основная сложность, которую я вижу, заключается в том, что вам нужно сделать заказ по столбцам из обеих таблиц. Таким образом, первые 15 различных продуктов появятся в переменном количестве строк, учитывая связь с типами. Самый простой способ может быть с GROUP_CONCAT

SELECT
    p.*,GROUP_CONCAT(t.type)
FROM
    products p INNER JOIN types t ON p.product_id=t.product_id
WHERE
    [your WHERE clauses]
GROUP BY
    p.product_id
ORDER BY
    [columns]
LIMIT 15

Однако это дает вам ограниченные данные о ваших типах и может вызвать проблемы в вашем ORDER BY, как это происходит после GROUP.

Вы, вероятно, хотите сделать что-то подобное

SELECT
    *
FROM
    ( SELECT
        DISTINCT p.*
    FROM
        products p INNER JOIN types t ON p.product_id=t.product_id
    WHERE
        [your WHERE clauses]
    ORDER BY
        [columns]
    LIMIT 15 ) pl
INNER JOIN types tl ON pl.product_id=tl.product_id

Что нужно сделать, так это получить первые 15 строк DISTINCT из таблицы продуктов, если они объединены в таблице типов и ORDERed по вашим критериям, а затем получить все типы для этих продуктов.

...