加入不等于?

时间:2019-03-05 19:43:39

标签: mysql sql join

我遇到了一个问题。

以下代码的作用是,仅在第二个表的条件匹配(并且从查询[WHERE]中排除当前成员[player_id])时,才从第一个表中获取详细信息。

我需要做的是从第一个表中获取数据,而从第二个表中排除用户。

因此,如果播放器已经与用户匹配,则将其从结果中排除; 它应该是以前没有匹配的用户的列表

匹配项仅在事件发生后存在,因此需要检查是否存在匹配项。

我认为在JOIN中使用<>就足够了,但是它不起作用,并且旧线程说要使用OUTER,但这也不起作用。 LEFT JOIN不排除,RIGHT JOIN返回的值与JOIN相同。

SELECT
    a.user_id,
    b.*
FROM
    tblUsers a
        JOIN tblMatches b
            ON (b.player_1 = ". $player_id ." AND b.player_2 = a.user_id)
            OR (b.player_2 = ". $player_id ." AND b.player_1 = a.user_id)
WHERE
    a.user_id <> ". $player_id ."
GROUP BY
    a.user_id

样本数据更新:

  • tblUsers,实际上是用户ID的列表(1、2、3、4等)。
  • tblMatches,一个用户ID和另一个用户ID(1、2、3、2、3、4和1等)

2 个答案:

答案 0 :(得分:0)

好的,是的...迈克尔·伯科夫斯基(Michael Berkowski)说的话,LEFT JOIN和IS NULL。

这是我更新的代码:

SELECT
    a.user_id,
    b.*
FROM
    $wpdb->usermeta a
        LEFT JOIN wp_matches b
            ON (b.player_1 = ". $player_id ." AND b.player_2 = a.user_id)
            OR (b.player_2 = ". $player_id ." AND b.player_1 = a.user_id)
WHERE
    b.player_1 IS NULL AND b.player_2 IS NULL
GROUP BY
    a.user_id

需要进行一些调整以包括更多条件,但是我现在不包括任何匹配的用户。

答案 1 :(得分:0)

是否只需要从变量中与玩家对抗的用户?
然后,NOT EXISTS可以帮助解决这个问题。

类似这样的东西:

SELECT user_id
FROM tblUsers u
WHERE NOT EXISTS
(
    SELECT 1
    FROM tblMatches m
    WHERE @player_id IN (m.player_1, m.player_2)
      AND u.user_id IN (m.player_1, m.player_2)
)