如果表2中不存在对,则从表1(使用UNION)中选择2行

The*_*s80 6 mysql

所以我有两张桌子:

uno:

id      |  gender  |   lf 
-------------------------
abc   |       1      |    2
cde   |       2      |    1
efg   |       1      |    2
Run Code Online (Sandbox Code Playgroud)

二人组:

id1    |    id2 
-------------------------
abc   |   cde
Run Code Online (Sandbox Code Playgroud)

我的工作(到目前为止)查询从表uno中精确选择了2行:

(SELECT 
  * 
FROM
  uno 
WHERE gender = 1 
  AND lf = 2 
ORDER BY RAND() 
LIMIT 1) 
UNION
(SELECT 
  * 
FROM
  uno 
WHERE gender = 2 
  AND lf = 1 
ORDER BY RAND() 
LIMIT 1)
Run Code Online (Sandbox Code Playgroud)

哪个回报:

id    |   gender     | lf
-------------------------
abc   |       1      |    2
cde   |       2      |    1
Run Code Online (Sandbox Code Playgroud)

我需要的(并且还没弄清楚是否可以使用查询)是返回2个未在表二重奏中配对的ID .

在这个例子中,上面的查询不应该返回abc,cde因为它们已经在表二重奏中(可能的对是efg和abc,efg和cde,因为它们在表二重奏中找不到).

谢谢!

更新:在chiliNUT的帮助下,我带来了这个:

(SELECT 
  id,gender,lf 
FROM
  uno u1 
WHERE NOT EXISTS 
  /* id1-centric exclusion rule  */
  /* look at id1 FROM duo, exclude it IF it IS IN uno AND id2 IS also IN uno */
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    duo d 
    LEFT JOIN uno u2 /* note the JOIN order, duo on uno */
      ON d.id2 = u2.id 
  WHERE d.id1 = u1.id) 
  /* id2-centric exclusion rule  */
  /* look at id1 FROM duo, exclude it IF it IS IN uno AND id2 IS also IN uno */
  AND NOT EXISTS 
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    uno u2 
    LEFT JOIN duo d /* note the JOIN order, uno on duo */
      ON d.id1 = u2.id 
  WHERE d.id2 = u1.id) and  (gender=1 and lf=2)order by rand() limit 1)UNION(SELECT 
  id,gender,lf 
FROM
  uno u1 
WHERE NOT EXISTS 
  /* id1-centric exclusion rule  */
  /* look at id1 FROM duo, exclude it IF it IS IN uno AND id2 IS also IN uno */
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    duo d 
    LEFT JOIN uno u2 /* note the JOIN order, duo on uno */
      ON d.id2 = u2.id 
  WHERE d.id1 = u1.id) 
  /* id2-centric exclusion rule  */
  /* look at id1 FROM duo, exclude it IF it IS IN uno AND id2 IS also IN uno */
  AND NOT EXISTS 
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    uno u2 
    LEFT JOIN duo d /* note the JOIN order, uno on duo */
      ON d.id1 = u2.id 
  WHERE d.id2 = u1.id) and  (gender=2 and lf=1) order by rand() limit 1)
Run Code Online (Sandbox Code Playgroud)

我不得不编辑所以它会产生2个ID(具有不同的性别和lf).这肯定没有优化,可能会挂起我的数据库,但它是一个开始!谢谢辣椒!

chi*_*NUT 2

以下查询将选择id中的所有 s uno,其中id不是一id1,id2对的成员。它查看每个idin uno,然后检查它是否与 a 匹配duo.id1,如果匹配,则检查关联的是否duo.id2也在 in 中uno。然后,在另一个方向上,它检查 in 是否与idauno匹配duo.id2,然后检查 the 是否duo.id1也在 uno 中。

SELECT 
  id 
FROM
  uno u1 
WHERE NOT EXISTS 
  /* id1-centric exclusion rule  */
  /* look at id1 FROM duo, exclude it if it is in uno AND id2 is also in uno */
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    duo d 
    LEFT JOIN uno u2 /* note the JOIN order, duo on uno */
      ON d.id2 = u2.id 
  WHERE d.id1 = u1.id) 
  /* id2-centric exclusion rule  */
  /* look at id2 FROM duo, exclude it id it is in uno AND id1 is also in uno */
  AND NOT EXISTS 
  (SELECT 
    d.id1,
    d.id2,
    u2.id 
  FROM
    uno u2 
    LEFT JOIN duo d /* note the JOIN order, uno on duo */
      ON d.id1 = u2.id 
  WHERE d.id2 = u1.id)

|id |
+---+
|efg|
Run Code Online (Sandbox Code Playgroud)

如果删除第二个存在子句,它将返回cde,但不返回abc。如果删除第一个存在子句,它会返回abc,但不会返回cde。所以两者都是需要的。