我想从'item_matches'中不存在的db'items'中拉2个记录(限制2(。
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选择
这里的一种方法是乘以items
表的交叉接口来生成所有对,然后将其与item_matches
表的连接在一起,以检查不完全匹配的对。这里的逻辑是,如果连接列fA
或fB
都为null,则意味着找不到该对的确切匹配。
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您要保留的记录(。
demo
一种可能的方法是使用反加入模式
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
http://sqlfiddle.com/#!9/6498ec/2