нужна помощь с хитрым запросом MySQL - PullRequest
3 голосов
/ 25 марта 2011

Я прошу очень много здесь - но, может быть, какой-то гуру SQL может показать мне, как извлечь нужные мне данные и сэкономить мне 10+ часов времени в Google (TM)?

ЭтоМои таблицы, в которых отображаются только соответствующие поля:

**event**
id
cust_id
....

.

**art**
id
art_name
...

.

**event_art**
event_id
art_id
...

.

**price**
cust_id
art_id
price
...

Цены указаны вБД "price" с идентификатором пользователя "0" является стандартной ценой, если существует запись с art_id и cust_id, которая является специфичной для клиента ценой для этой статьи.

То, что у меня есть, это cust_id и то, что я имею для вывода сейчасэто просто специфичные для клиента цены с SQL:

SELECT * FROM price WHERE cust_id='{$custID}' 

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

Так чтоМне нужно это:

1 Получить все идентификаторы из таблицы событий, где cust_id = custID

2 Получить все отдельные идентификаторы статей по этим заказам изтаблица event_art

3 Вывести "id" и "art_name" статьи из "art" и "price" сюдаm таблица цен, использующая custID или 0 для стандартной цены, если записи не существует.

Для меня это звучит как многострочное соединение, которое немного выходит за рамки моих знаний SQL.Кто-нибудь может мне помочь, указать мне руководство, которое имеет дело с подобными проблемами или ... ну, что-то?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 25 марта 2011
SELECT  art_id, price
FROM    price
WHERE   cust_id = $cust_id
UNION ALL
SELECT  art_id, price
FROM    (
        SELECT  DISTINCT art_id
        FROM    event e
        JOIN    event_art ea
        ON      ea.event_id = e.id
        WHERE   e.cust_id = $cust_id
                AND ea.art_id NOT IN
                (
                SELECT  art_id
                FROM    price
                WHERE   cust_id = $cust_id
                )
        ) e
JOIN    price p
ON      p.cust_id = 0
        AND p.art_id = e.art_id

Убедитесь, что (cust_id, art_id) (в этом порядке) является PRIMARY KEY или UNIQUE INDEX на price.

0 голосов
/ 28 марта 2011
SELECT DISTINCT
  a.id,
  a.art_name,
  COALESCE(p.price, p0.price) AS price
FROM event e
  INNER JOIN event_art ea ON e.id = ea.event_id
  INNER JOIN art a ON ea
  LEFT JOIN price p ON p.art_id = a.id AND p.cust_id = e.cust_id
  LEFT JOIN price p ON p.art_id = a.id AND p.cust_id = 0
0 голосов
/ 28 марта 2011

Пришлось внести небольшие изменения, чтобы указать, какая таблица использовалась в SQL, но в значительной степени копировать и вставлять, так что совсем неплохо: P

SELECT price.art_id, price.price
FROM   price
WHERE  cust_id =114
UNION ALL
SELECT e.art_id, p.price
FROM (

SELECT DISTINCT art_id
FROM event e
JOIN event_art ea ON ea.event_id = e.id
WHERE e.cust_id =114
AND ea.art_id NOT
IN (

SELECT price.art_id
FROM price
WHERE cust_id =114
)
)e
JOIN price p ON p.cust_id =0
AND p.art_id = e.art_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...