获取唯一行基于MySQL

时间:2017-05-07 10:26:19

标签: mysql

我试图找出一个查询来实现以下场景的输出,下面是我的表格数据

table entries

Id - >主键表1 请求ID - > FK(表2的PK)

Id - >多对一 - >请求ID列

问题: 我将从UI获取SID列值(LIST - >可以是一个或多个值),现在假设我得到一个列表(' 121' 122') ,我应该得到以下结果,query result

说明: 1.带有Id的行 - >因为我只需要具有SID(121,122)

组合的行,所以不需要3,4,5,6,7
  1. 假设我收到一个SID列表(' 121'),那么结果应该如下query result 2,即使其他条目在SID中有121但是它们有相同的请求ID也出现在其他行中..
  2. 所以底线是IM尝试获取只有SID组合的Request id ..如果SID列表有2个值,那么我想要具有相同Request ID的行,同时Request ID不应该出现在另一个除了列表之外的SID。

    过去2天我一直坚持这个查询,非常感谢任何帮助。

    编辑:SQlFiddle - > http://sqlfiddle.com/#!9/98484b/1

1 个答案:

答案 0 :(得分:0)

MariaDB [sandbox]> CREATE TABLE T(ID INT,REQUESTID INT, SID INT);
Query OK, 0 rows affected (0.28 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO T VALUES
    -> (1,1,121),(2,1,122),
    -> (3,2,121),(4,3,123),
    -> (5,3,121),(6,3,125),
    -> (7,3,126),(8,4,121),
    -> (9,4,122);
Query OK, 9 rows affected (0.06 sec)
Records: 9  Duplicates: 0  Warnings: 0

MariaDB [sandbox]>
MariaDB [sandbox]>
MariaDB [sandbox]> SELECT T.ID,S.* FROM
    -> (
    -> SELECT REQUESTID ,GROUP_CONCAT(ID),GROUP_CONCAT(SID ORDER BY SID) SID
    -> FROM T
    -> GROUP BY REQUESTID
    -> ) S
    -> JOIN T ON T.REQUESTID = S.REQUESTID
    -> WHERE S.SID = '121,122';
+------+-----------+------------------+---------+
| ID   | REQUESTID | GROUP_CONCAT(ID) | SID     |
+------+-----------+------------------+---------+
|    1 |         1 | 1,2              | 121,122 |
|    2 |         1 | 1,2              | 121,122 |
|    8 |         4 | 8,9              | 121,122 |
|    9 |         4 | 8,9              | 121,122 |
+------+-----------+------------------+---------+
4 rows in set (0.02 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> SELECT T.ID,S.* FROM
    -> (
    -> SELECT REQUESTID ,GROUP_CONCAT(ID),GROUP_CONCAT(SID ORDER BY SID) SID
    -> FROM T
    -> GROUP BY REQUESTID
    -> ) S
    -> JOIN T ON T.REQUESTID = S.REQUESTID
    -> WHERE S.SID = '121';
+------+-----------+------------------+------+
| ID   | REQUESTID | GROUP_CONCAT(ID) | SID  |
+------+-----------+------------------+------+
|    3 |         2 | 3                | 121  |
+------+-----------+------------------+------+
1 row in set (0.02 sec)