MySQL选择不在另一个表中的ID

时间:2015-02-28 19:06:34

标签: php mysql sql

我试图编写一个查询,从项目列表中选择两个ID,这些ID从未在头对头的匹配中遇到过(之前的头对头匹配存储在一张名为Face-offs的表格。目的是为下一场比赛选择两个ID。它们应该是随机的,因此您可以继续运行查询,并继续返回一个新的随机对峙。

产品:

+----+-----------+
| ID | Item name |
+----+-----------+
|  1 | trees     |
|  2 | plants    |
|  3 | animals   |
+----+-----------+

脸部附加赛:

+--------+-------+
| winner | loser |
+--------+-------+
|      1 |     2 |
|      2 |     3 |
+--------+-------+

目前,我有这个问题:

select id from items order by rand() limit 2

选择两个随机项目ID,但是,我不知道如何确定他们之前是否在Face-Off表的两个不同列中相遇。

这个查询可以只使用MySQL完成,还是我必须反复循环查询直到返回结果?

1 个答案:

答案 0 :(得分:1)

您应该返回一行,其中包含两个未满足面部的项目。编写查询的简单方法是:

select i1.id as id1, i2.id as id2
from items i1 cross join
     items i2 left join
     faceoffs f
     on (f.winner = i1.id and f.loser = i2.id) or
        (f.winner = i2.id and f.loser = i1.id)
where f.winner is null and i1.id <> i2.id
order by rand()
limit 1;

这可能对你有用。但是,表现可能是非常糟糕的。以下是一种可能具有更好性能的方法,因为它首先选择一个randome项目。缺点是随机可能会遇到其他一切,所以它可能不会返回任何东西。你可以再打一次:

select i1.id
from (select id
      from items
      order by rand()
      limit 1
     ) i1 cross join
     items i2 left join
     faceoffs f
     on (f.winner = i1.id and f.loser = i2.id) or
        (f.winner = i2.id and f.loser = i1.id)
where f.winner is NULL and i1.id <> i2.id;