【问题标题】:MySQL - join two tables, searching in the secondMySQL - 连接两个表,在第二个中搜索
【发布时间】:2012-08-23 21:47:33
【问题描述】:

伙计们,

我有两张桌子:

表 1:

UID    NAME
1      Name1
2      Name2
3      Name3

表 2:

UID    PID    PARAM
1      1     10
2      1     20
3      2     10
4      2     30
5      2     40
6      3     60
7      3     20
8      3     10

我需要连接两个表 (t1.UID=t2.PID) 并仅列出第一个表中的记录,例如,第二个表中具有(例如)PARAM=10 和 PARAM=20 的记录。这样,对于这个例子,查询应该返回:

UID      NAME
1        Name1
3        Name3

..因为只有 Name1 AND Name3 有 BOTH PARAM=10 AND PARAM=20

我该怎么做?我知道这可能很简单,但我找不到答案,这里也找不到,谷歌也找不到。

提前感谢您! 内德

【问题讨论】:

    标签: mysql join where-clause


    【解决方案1】:

    这个查询应该可以工作:

    SELECT t1.* 
    FROM table1 t1 
         INNER JOIN (SELECT PID 
                     FROM table2  
                     WHERE PARAM IN(10, 20)
                     GROUP BY PID
                     HAVING COUNT(*) = 2
                    )t2
                    ON t1.UID = t2.PID;
    

    【讨论】:

    • 谢谢,但您的解决方案还返回 Name2,它的 PARAM=10,但没有 PARAM=20.. 我需要同时具有 PARAM=10 和 PARAM=20 的记录
    • 第一个不正确,如果只有10个就会返回结果,满足in (10,20)。检查我的查询,希望它会起作用!
    • 感谢您的回答!您的解决方案甚至更好,因为您的方式我可以更轻松地连接更多表(如 table2)并根据不同的条件进行更大的搜索!
    【解决方案2】:
    select a.name          
    from table1 a
    inner join table2 b on (a.UID = b.PID)
    where b.param in (10, 20)
    group by a.name
    having count(*) = 2
    

    通过声明您的表 table1 a,您可以通过将声明名称的表放入列 a.name 的 from 中来调用该表中的任何列

    【讨论】:

    • 现在它将是空结果,因为参数不能是 10 和 20 在同一行:)
    • 是的,我只需要第一个表中同时具有 param=10 和 param=20 的记录...例如它应该只返回 Name1 和 Name3,因为 Name2 有 param=10,但它没有 param=20
    • 在那里尝试我的编辑,这应该只返回同时具有 10 和 20 的编辑
    • 抱歉,我将name 列为names,再试一次
    • 这将基本上返回所有计数为 2 的 a.name,所以因为 name2 只有 param=10 而不是 param=20 它只会从 select a.name from table1 a inner join table2 b on (a.UID = b.PID) where b.param in (10, 20) 出现一次,其中 name1 和name3 都有 param=10 和 param=20 所以它们都出现了两次......所以这意味着 having count(*) = 2 只会返回 name1 和 name3,而不是 name2 因为它只出现一次......如果语句是 having count(*) <= 2 那么name2 也会被返回
    【解决方案3】:

    试试这个:

    select uid,name from t1 where exists (select 1 from t2 where param = 10 and pid = t1.uid) and exists (select 1 from t2 where param = 20 and pid = t1.uid);
    

    【讨论】:

      【解决方案4】:

      您不必加入:

      从表 1 中选择 * UID 在哪里( 从表 2 中选择 UID 参数在哪里 (10, 20) )

      【讨论】:

      • 谢谢,但您的解决方案还返回 Name2,它的 PARAM=10,但没有 PARAM=20.. 我需要同时具有 PARAM=10 和 PARAM=20 的记录
      • 对不起,我理解你的问题的方式是想要 10 或 20 的行。
      【解决方案5】:
      select distinct t1.id 
      from table1 t1 join table2 t2 on t1.uid = t2.pid and t2.param = 10 
                     join table2 t3 on t1.uid = t3.pid and t3.param = 20
      

      【讨论】:

      • 您的解决方案有效,但有更简单的方法吗?我在 Table2 中有很多很多 PARAMS 应该符合标准。如果用户检查 20 个参数,我将不得不进行 20 个连接......更不用说我必须以相同的方式(在同一个查询中)连接更多具有匹配条件的表,如表 2(但如果我成功,这将很容易一张桌子)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-04
      • 2016-11-05
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      相关资源
      最近更新 更多