【问题标题】:Filter using a many-to-many table MySQL使用多对多表 MySQL 过滤
【发布时间】:2012-09-09 18:48:17
【问题描述】:

我有以下表格(为简单起见,省略了其他表格)。 1 适用于所有人,2 适用于这些人所从事的运动。我正在使用 php 来允许用户查看人员列表。他们可以按人名或他们参加的运动进行过滤。所以,我希望能够看到所有打棒球和足球的人。

create table people (
  id int,
  name varchar(50)
  );

create table people_to_sports (
  personID int,
  sportID int,
  primary key(personID,sportID)
  );

基本上我的问题是,我如何使用 people_to_sports 来获取所有参加运动 1 和运动 2 的人的列表?

我有一个 sqlfiddle here

谢谢!

【问题讨论】:

    标签: mysql sql filter


    【解决方案1】:
    SELECT
      personID
    FROM
      people_to_sports
    WHERE
      sportID IN (1, 2)
    GROUP BY
      personID
    HAVING
      COUNT(*) = 2
    

    【讨论】:

      【解决方案2】:
      SELECT personID, COUNT(personID) AS cnt
      FROM people_to_sports
      WHERE sportID IN (1, 2)
      GROUP BY personID
      HAVING cnt = 2
      

      【讨论】:

      • @Mahmoud Gamal:在 mysql 中你可以
      • @a1ex07,不知道。这在 SQL SERVER 中是不可能的。谢谢
      • @dems:没有必要,因为您没有选择聚合字段以外的字段,但通常...是的,分组依据是必需的。
      • @MarcB - 真的吗?据我了解 MySQL:在GROUP BY 中未指定任何字段将始终只返回一行。允许选择personID;它仍然只返回一个值(非确定性选择),但不会将分组级别从all 更改为BY personID[作为副作用,COUNT(personID) 也将应用于所有行WHERE sportID IN (1,2)。这可能意味着HAVING cnt = 2 可能永远不会满足,因为结果可能总是远大于 2。]
      • 啊,是的……对。星期一早上...提醒我下午 5 点左右才起床。
      猜你喜欢
      • 2015-07-17
      • 2018-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多