SQL: поиск в дочерней таблице для определенных элементов - PullRequest
0 голосов
/ 21 февраля 2009

Рассмотрим следующую схему:

Customers:
Col      | Type    |
-------------------|
id       | INTEGER |
name     | VARCHAR |

Orders:
Col         | Type    |
----------------------|
id          | INTEGER |
customer_id | INTEGER |
date        | DATE    |

Items
Col         | Type    |
----------------------|
id          | INTEGER |
order_id    | INTEGER |
name        | VARCHAR |
quantity    | INTEGER |

А вот краткий обзор схемы: У клиента может быть много заказов, а у заказа может быть много предметов Примечание: Вы можете утверждать, что элементы должны ссылаться на таблицу некоторых продуктов с product_id, но пусть это будет просто, как сейчас.

Из моей базы данных я хочу задать следующий вопрос:

Для данного клиента перечислите все позиции, которые начинаются с La.

Моя версия запроса выглядит следующим образом:

ВЫБРАТЬ * ИЗ ИЗДЕЛИЙ, ГДЕ НАМ НРАВИТСЯ 'La%'

Это вернет ВСЕ товары, которые начинаются с La для ВСЕХ клиентов. Я хочу, чтобы я получил все товары для КОНКРЕТНОГО покупателя с скажем ID 1. Как мне написать такой запрос? Моя вторая версия, которая будет делать это так:

SELECT * ИЗ элементов, ГДЕ НАМ НРАВИТСЯ 'La%' И order_id в (идентификатор SELECT FROM заказов, ГДЕ customer_id = 1);

Но есть ли у них какой-нибудь другой эффективный / элегантный или более лучший способ сделать то же самое?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2009

выберите имя пользователя из списка клиентов c
присоединяйтесь к oders 100 * на c.id = o.customer_id
соединить элементы я
on o.id = i.order_id, где c.id = WHATEVER_CUSTOMER_ID_YOU_WANT
и i.name как 'La%'

4 голосов
/ 21 февраля 2009

Элегантный способ сделать это называется объединением.

SELECT
  c.id            customer_id,
  c.name          customer_name,
  i.id            item_id,
  i.name          item_name,
  COUNT(i.id)     order_count,
  SUM(i.quantity) items_ordered
FROM
  customers c
  INNER JOIN orders o ON c.id = o.customer_id
  INNER JOIN items  i ON i.id = o.order_id
WHERE
  i.name LIKE 'La%'
  AND c.id = 1
GROUP BY
  c.id,
  c.name,
  i.id,
  i.name
1 голос
/ 21 февраля 2009

Sub-SELECT - один из подходов, другой - присоединиться к таблицам и запросить их.

Как-то так, мой SQL очень ржавый, но я думаю, что это должно работать.

SELECT c.Name, o.id, o.date, i.name, i.quantity FROM Customer AS c
LEFT OUTER JOIN Orders AS o ON c.id = o.customer_id
LEFT OUTER JOIN Items AS i on o.id = i.order_id
WHERE i.name LIKE 'La%' AND c.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...