gpt4 book ai didi

MySQL - 如果在其他表中出现超过 x 次,则选择行

转载 作者:行者123 更新时间:2023-11-29 03:59:38 26 4
gpt4 key购买 nike

假设我有两个表,Members 和 Orders 具有 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

我正在尝试从 Members 表中获取 Members ID,以防该 Member 在 Orders 表中有超过 1 个订单。

所以结果应该是...

Members
UserID Name
111 Peter
333 Joe

...因为 Peter 和 Joe 在 Orders 表中至少有 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
)

但这给了我 Peter 3 次,Joe 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);

您可以使用 GROUP BYHAVING 子句,这将为您提供所有用户的 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;

SQLFiddle:http://sqlfiddle.com/#!9/1dadc4/2

但是,如果您已经存储了名称(并且没有改变),那么您可以跳过 JOIN,如下所示:

SELECT
UserID,
Name
FROM
Orders
GROUP BY
UserID,
Name
HAVING
COUNT(OrderID) > 1

关于MySQL - 如果在其他表中出现超过 x 次,则选择行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com