1

我需要获取他们偏好 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

4

3 回答 3

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 for ALL item ...那么您可以这样做

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
于 2013-05-05T16:05:34.953 回答
0

这将显示所有具有相同价格偏好的客户名称。

SELECT minprice, maxprice, GROUP_CONCAT(name) names
FROM preference
JOIN customer USING (phone)
GROUP BY minprice, maxprice
HAVING COUNT(*) > 1

HAVING子句阻止它显示没有重复的首选项。如果您想查看那些单一客户的偏好,请删除该行。

于 2013-05-05T16:18:15.823 回答
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
于 2013-05-05T15:35:39.380 回答