从数据库中选择2个来自另一个数据库

时间:2018-02-06 01:28:30

标签: php mysql

我想从数据库'项目'中提取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

2 个答案:

答案 0 :(得分:1)

这里的一种方法是采用items表的交叉连接来生成所有对,然后在item_matches表左边连接以检查不完全匹配的对。这里的逻辑是,如果连接列fAfB中的任何一个为空,则表示无法找到该对的完全匹配。

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

答案 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 

http://sqlfiddle.com/#!9/6498ec/2