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

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一次。如何获得没有重复的结果?

kch*_*son 5

我假设(并希望)您不会存储用户名两次,因为这会在用户更改其名称时导致数据质量问题。

假设表的结构如下:

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)

  • 最后一个查询是此问题的最佳答案。问题中没有“ join”的必要。 (3认同)