我在这里要求很多 - 但也许一些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知识范围。有人可以帮助我,指出一个处理类似问题的指南,或者......好吧,某事?
提前致谢!
答案 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 INDEX
或price
。
答案 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