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

标签 mysql sql join count

假设我有两个表,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/

相关文章:

mysql - 更新插入而不使用重复键 MYSQL

php - 无法使用 PHP 连接 MySQL 服务器

sql - 复杂的 Join Query,Join 3 tables with multiple group bys

sql - 为什么DBMS不支持ASSERTION

join - solr join - 返回父子文档

android - 请帮助我了解有关 Android 连接到 mysql 的信息。 logcat 告诉我这个 org.json.JSONException : No value for report_data

php - mysql自增和唯一字段

R:通过 *list* 列连接两个表(tibbles)

php - 如何获取表2中没有的值

mysql - 在 mysql 中使用 group by 和 join 时没有得到正确的结果