Сложная группа SQL / объединение по категориям - PullRequest
1 голос
/ 12 мая 2010

В настоящее время у меня есть структура базы данных с двумя важными таблицами.

1) Типы продуктов питания (фрукты, овощи, мясо)

2) Конкретные продукты (яблоко, апельсины, морковь, салат, стейк, свинина)

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

Фрукты <Яблоко, Апельсин </p>

Овощи <Морковь, салат </p>

Мясо <Стейк, Портвейн </p>

Я пытался использовать утверждение вроде следующего

Select * From Food_Type join (Select * From Foods) as Foods on Food_Type.Type_ID = Foods.Type_ID

но это возвращает каждую конкретную еду, а я хочу только первые 2 на категорию. Поэтому мне нужно, чтобы в моем подзапросе содержался оператор limit, чтобы он находил только первые 2 в каждой категории.

Однако, если я просто сделаю следующее

   Select * From Food_Type join (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID

Мое утверждение возвращает всего 2 результата.

1 Ответ

1 голос
/ 12 мая 2010

Ответил здесь , но этот ответ был специфичным для mysql в конце.

Если ваша база данных более соответствует стандарту, вы также можете использовать PARTITION

Примечание:

Select * 
From Food_Type join 
     (Select * From Foods LIMIT 2) as Foods on Food_Type.Type_ID = Foods.Type_ID

(Select * From Foods LIMIT 2) возвращает только две записи из всей таблицы, объединение происходит только после возврата запроса.

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

Select * 
From Food_Type join 
     Foods on Food_Type.Type_ID = Foods.Type_ID
Where Foods.Foods_ID IN (Select * 
                         From Foods AS nested 
                         Where nested.Type_ID = Food_Type.Type_ID 
                         ORDER BY ? 
                         LIMIT 2)

Подход PARTITION / RANK отличается и должен быть быстрее, если вам нужна помощь, сообщите нам.

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