我需要获得他们的偏好MINPRICE和MAXPRICE相同的所有客户名称。
这是我的架构:
CREATE TABLE CUSTOMER (
PHONE VARCHAR(25) NOT NULL,
NAME VARCHAR(25),
CONSTRAINT CUSTOMER_PKEY PRIMARY KEY (PHONE),
);
CREATE TABLE PREFERENCE (
PHONE VARCHAR(25) NOT NULL,
ITEM VARCHAR(25) NOT NULL,
MAXPRICE NUMBER(8,2),
MINPRICE NUMBER(8,2),
CONSTRAINT PREFERENCE_PKEY PRIMARY KEY (PHONE, ITEM),
CONSTRAINT PREFERENCE_FKEY FOREIGN KEY (PHONE) REFERENCES CUSTOMER (PHONE)
);
我想我需要在行和行之间做一些比较?或创建另一个视图进行比较?任何简单的方法吗?
它的一对多。客户可以有多个首选项,因此我需要查询具有相同minprice和maxprice的客户列表。比较行minprice = minprice和maxprice = maxprice答案 0 :(得分:0)
preference
上的自我加入会找到具有相同价格偏好但行号不同的行:
select distinct c1.name
, p1.minprice
, p1.maxprice
from preference p1
join preference p2
on p1.phone <> p2.phone
and p1.minprice = p2.minprice
and p1.maxprice = p2.maxprice
join customer c1
on c1.phone = p1.phone
join customer c2
on c2.phone = p2.phone
order by
p1.minprice
, p1.maxprice
, c1.name
答案 1 :(得分:0)
您的偏好表中有minprice和maxprice似乎很奇怪。这是您在每次交易后更新的表格,以便每个客户只有1个有效的首选项记录吗?我的意思是,它看起来像客户可以为同一项目支付两种不同的价格,这看起来很奇怪。
假设客户和偏好是1:1
SELECT c.*
FROM customer c INNER JOIN preference p ON c.phone = p.phone
WHERE p.minprice = p.maxprice
但是,如果客户可以有多个首选项,并且您正在为所有项目寻找minprice = maxprice ...那么您可以这样做
SELECT c.*
FROM (SELECT phone, MIN(minprice) as allMin, MAX(maxprice) as allMax
FROM preference
GROUP BY phone) p INNER JOIN customer c on p.phone = c.phone
WHERE allMin = allMax
答案 2 :(得分:0)
这将显示具有相同价格偏好的所有客户名称。
SELECT minprice, maxprice, GROUP_CONCAT(name) names
FROM preference
JOIN customer USING (phone)
GROUP BY minprice, maxprice
HAVING COUNT(*) > 1
HAVING
子句阻止它显示没有重复项的首选项。如果您想查看这些单客户首选项,请删除该行。