我想从数据库'项目'中提取2条记录(限制2)。在' item_matches'中并不存在在任何一个领域' fA'或者' fB'。
item_matches
+------+------+
| fA | fB |
+------+------+
| abc | roc |
| def | pod |
| ghi | his |
| 4 | 6 |
| 5 | |
+------+------+
+------+
| items|
+------+
| abc |
| def |
| ghi |
| roc |
| pop |
| blr |
| doc |
+------+
未选择abc和roc
未选择roc和abc
ghi和roc选择了
def和pod未选中
ghi和他未被选中
选择doc和pod
答案 0 :(得分:1)
这里的一种方法是采用items
表的交叉连接来生成所有对,然后在item_matches
表左边连接以检查不完全匹配的对。这里的逻辑是,如果连接列fA
或fB
中的任何一个为空,则表示无法找到该对的完全匹配。
SELECT i.item1, i.item2
FROM
(
SELECT t1.BAND AS item1, t2.BAND AS item2
FROM items t1
INNER JOIN items t2
ON t1.BAND <> t2.BAND
WHERE t1.active = 1 AND t2.active = 1
) i
LEFT JOIN item_matches im
ON i.item1 = im.fA AND
i.item2 = im.fB
WHERE
im.fA IS NULL OR im.fB IS NULL
ORDER BY RAND()
LIMIT 2;
我选择在上面的查询中使用随机排序,但您可能想要更改它。在任何情况下,在没有提供排序的情况下在结果集上使用LIMIT
通常没有多大意义(因为您没有告诉数据库您希望哪个 2条记录保留)。
答案 1 :(得分:1)
一种可能的方法是使用反连接模式
SELECT a.colname
, b.colname
FROM items a
JOIN items b
ON NOT ( a.colname <=> b.colname )
LEFT
JOIN item_matches m
ON m.fA = a.colname
AND m.fB = b.colname
LEFT
JOIN item_matches o
ON o.fA = b.colname
AND o.fB = a.colname
WHERE m.fA IS NULL
AND o.fA IS NULL
ORDER BY NULL
LIMIT 2