需要帮助处理棘手的mySQL查询

时间:2011-03-25 11:26:11

标签: mysql sql

我在这里要求很多 - 但也许一些SQL大师可以告诉我如何提取我想要的数据并节省我10个小时的谷歌时间(tm)?

这些是我的表格,只显示相关字段:

**event**
id
cust_id
....

**art**
id
art_name
...

**event_art**
event_id
art_id
...

**price**
cust_id
art_id
price
...

用户ID为“0”的“价格”数据库中的价格是标准价格,如果存在art_id和cust_id的条目,该条目是该商品的客户特定价格。

我拥有的是cust_id,现在输出的内容只是客户特定的SQL价格:

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

但是我想包括以前订购的商品的价格,即使他们没有特定于客户的价格。

所以我需要的是:

1 从表事件获取所有id,其中cust_id = custID

2 从表event_art获取这些订单的所有不同文章ID

3 如果没有条目,则使用custID从价格表中输出“art”和“price”的商品“id”和“art_name”或标准价格为0。

对我而言,这听起来像是一个多行的JOIN,这有点超出了我的SQL知识范围。有人可以帮助我,指出一个处理类似问题的指南,或者......好吧,某事?

提前致谢!

3 个答案:

答案 0 :(得分:4)

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 INDEXprice

答案 1 :(得分:0)

必须进行一些小的更改,以指示在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

答案 2 :(得分:0)

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