use*_*191 1 mysql sql join count
可以说我有两个表,“成员”和“订单”具有1:N的关系:
Members | Orders
UserID Name | OrderID UserID Name
111 Peter | 777 111 Peter
222 Bart | 888 333 Joe
333 Joe | 999 111 Peter
444 Andrew | 101 444 Andrew
| 102 111 Peter
| 103 333 Joe
Run Code Online (Sandbox Code Playgroud)
如果会员在订单表中有多个订单,我正在尝试从会员表中获取会员ID。
所以结果应该是
Members
UserID Name
111 Peter
333 Joe
Run Code Online (Sandbox Code Playgroud)
...因为彼得和乔在“订单”表中都至少有2个订单。
我试图获得以下结果:
SELECT
s.UserID,
FROM Members s
INNER JOIN Orders o
ON s.UserID = o.UserID
WHERE
s.UserID IN
(
SELECT UserID
FROM Orders
GROUP BY UserID
HAVING COUNT(*) > 5
)
Run Code Online (Sandbox Code Playgroud)
但这给了我彼得3次,乔2次。因此我得到重复而不是每个UserID一次。如何获得没有重复的结果?
我假设(并希望)您不会存储用户名两次,因为这会在用户更改其名称时导致数据质量问题。
假设表的结构如下:
CREATE TABLE
Members
(
UserID INT,
Name VARCHAR(15)
);
INSERT INTO
Members
VALUES
(111, 'Peter'),
(222, 'Bart'),
(333, 'Joe'),
(444, 'Andrew');
CREATE TABLE
Orders
(
OrderID INT,
UserID INT
);
INSERT INTO
Orders
VALUES
(777, 111),
(888, 333),
(999, 111),
(101, 444),
(102, 111),
(103, 333);
Run Code Online (Sandbox Code Playgroud)
您可以使用GROUP BYand HAVING子句,该子句将为您UserID提供具有1个以上(或您选择的任意数量)订单的所有用户。然后,将其连接到Members表以获取名称。
SELECT
Orders.UserID,
Members.Name
FROM
Orders
INNER JOIN
Members
ON Orders.UserID = Members.UserID
GROUP BY
UserID,
Members.Name
HAVING
COUNT(OrderID) > 1;
Run Code Online (Sandbox Code Playgroud)
SQLFiddle:http ://sqlfiddle.com/#!9/1dadc4/2
但是,如果您已经存储了名称(并且没有更改),则可以跳过JOIN以下内容:
SELECT
UserID,
Name
FROM
Orders
GROUP BY
UserID,
Name
HAVING
COUNT(OrderID) > 1
Run Code Online (Sandbox Code Playgroud)