如何通过匹配Mysql中的相同表来获取数据

时间:2012-09-06 05:57:01

标签: mysql join

我在Mysql DB中有以下表结构 表:Mytable

--------------------------------
| uid | locationid | projectid |
--------------------------------
|  2  |      4     |    2     | 
|  2  |      4     |    2     | 
|  2  |      3     |    5     | 
|  2  |      3     |    5     | 
|  2  |      1     |    2     | 
|  2  |      1     |    2     | 
|  2  |      1     |    2     | 
|  2  |      1     |    1     | 
|  3  |      1     |    5     | 
|  3  |      1     |    2     | 
|  3  |      1     |    1     | 
|  3  |      1     |    1     | 
|  7  |      3     |    1     | 
|  5  |      1     |    5     | 
|  6  |      4     |    2     | 
|  5  |      1     |    5     | 
|  3  |      4     |    1     | 
|  3  |      3     |    3     | 
|  7  |      4     |    2     | 
|  7  |      4     |    3     | 

说我通过了uid = 2然后为uid = 2,locationid和projectid的唯一组合就是这个

|  2  |      4     |    2     | 
|  2  |      3     |    5     | 
|  2  |      1     |    2     | 
|  2  |      1     |    1     | 

现在我希望所有uid都具有上述locationid和projectid组合匹配。意味着结果应该是

|  3  |      1     |    2     | 
|  3  |      1     |    1     | 
|  3  |      1     |    1     | 
|  6  |      4     |    2     | 
|  7  |      4     |    2     | 

如果我通过uid = 3,则结果应为

|  2  |      1     |    2     | 
|  2  |      1     |    2     | 
|  2  |      1     |    2     | 
|  2  |      1     |    1     | 
|  5  |      1     |    5     | 
|  5  |      1     |    5     | 

为此,我使用了以下查询,但由于locationid和projectid组合不匹配,它给出了错误的结果

 SELECT a.*
 FROM Mytable a, Mytable b 
 WHERE a.locationid = b.locationid
 AND a.projectid = b.projectid
 AND a.locationid IN (SELECT DISTINCT locationid FROM Mytable WHERE uid=$pmid)
 AND a.projectid IN(SELECT DISTINCT projectid FROM Mytable WHERE uid=$pmid)
 AND a.uid !=$pmid

这里$ pmid是我通过的uid值。我的查询有什么问题?我的查询是对的吗? 请帮帮我。

提前致谢。

3 个答案:

答案 0 :(得分:2)

这应该有效:

SELECT a.*
FROM Mytable a
     INNER JOIN (SELECT DISTINCT locationid, projectid
                 FROM   Mytable
                 WHERE  uid = 2
                ) b
        ON a.locationid = b.locationid
           AND a.projectid = b.projectid
           AND a.uid <> 2;

示例:SQLFiddle

答案 1 :(得分:0)

试试这个:

SELECT t.* 
FROM   Mytable t
JOIN
       ( SELECT distinct locationid , projectid
         FROM Mytable
         WHERE uid=<uid>)a
ON     t.locationid =a.locationid 
AND    t.projectid=a.projectid
WHERE  t.uid != <uid>

答案 2 :(得分:0)

尝试此查询 -

SELECT t1.* FROM mytable t1
  JOIN (SELECT * FROM mytable WHERE uid = 2 GROUP BY locationid, projectid) t2
    ON t1.uid <> t2.uid AND
       t1.locationid = t2.locationid AND
       t1.projectid = t2.projectid;

在WHERE子句中指定uid(第二行)。