MySQL 根据条件连接两个表
MySQL join two tables based on a condition
我有两个table。
用户
| id | name |
| ---|-------|
| 1 | Jhon |
| 2 | David |
滑动
| id | swp_from | swp_to| first_swp| second_swp |
| ---|----------|-------|----------|------------|
| 1 | 1 | 2 | like | pending |
| 2 | 1 | 2 | like | pending |
我需要根据条件将 swp_from
和 swp_to
中的这些加入 tables。
我的查询是这样的:
SELECT name, swp_to, first_swp FROM swipes
LEFT JOIN users ON users.id = swipes.swp_to // JOINING WITH swp_to TO MATCH FIRST WHERE CONDITION
WHERE
(swipes.swp_from = :me AND ((swipes.first_swp NOT IN ('like', 'superlike')) OR (swipes.first_swp IN ('like', 'superlike') AND swipes.second_swp NOT IN ('like', 'superlike')))) // FIRST CONDITION
OR
(swipes.swp_to = :me AND swpipes.second_swp != 'pending') // FOR THIS SECOND CONDITION I NEED TO JOIN USERS TABLE USING swp_from AS WELL IN THIS SAME QUERY
正如上面查询中所解释的,我已经将 swp_to
与 users
table 连接了起来。但是我还需要在 WHERE
子句中使用 users
table 加入 swp_from
作为第二个条件。我该怎么做?
简单来说,如果满足第一个 where 条件,我需要使用 swp_to
与 users
table 连接的查询。如果满足第二个 where 条件(在 OR 之后),那么我希望连接使用 swp_from
而不是 swp_to
。这应该发生在每一行。 PHP 条件逻辑解决方法也可以。
条件应移至 ON
子句。
在 MySql 中,CASE
表达式可用于 return 布尔表达式的结果(如 1
或 0
用于 true
或 false
) 像这样:
SELECT u.name, s.swp_to, s.first_swp
FROM swipes s LEFT JOIN users u
ON CASE (s.swp_from = :me AND ((s.first_swp NOT IN ('like', 'superlike')) OR (s.first_swp IN ('like', 'superlike') AND s.second_swp NOT IN ('like', 'superlike'))))
WHEN 1 THEN u.id = s.swp_to
WHEN 0 THEN u.id = s.swp_from AND (s.swp_to = :me AND s.second_swp <> 'pending')
END;
我有两个table。
用户
| id | name |
| ---|-------|
| 1 | Jhon |
| 2 | David |
滑动
| id | swp_from | swp_to| first_swp| second_swp |
| ---|----------|-------|----------|------------|
| 1 | 1 | 2 | like | pending |
| 2 | 1 | 2 | like | pending |
我需要根据条件将 swp_from
和 swp_to
中的这些加入 tables。
我的查询是这样的:
SELECT name, swp_to, first_swp FROM swipes
LEFT JOIN users ON users.id = swipes.swp_to // JOINING WITH swp_to TO MATCH FIRST WHERE CONDITION
WHERE
(swipes.swp_from = :me AND ((swipes.first_swp NOT IN ('like', 'superlike')) OR (swipes.first_swp IN ('like', 'superlike') AND swipes.second_swp NOT IN ('like', 'superlike')))) // FIRST CONDITION
OR
(swipes.swp_to = :me AND swpipes.second_swp != 'pending') // FOR THIS SECOND CONDITION I NEED TO JOIN USERS TABLE USING swp_from AS WELL IN THIS SAME QUERY
正如上面查询中所解释的,我已经将 swp_to
与 users
table 连接了起来。但是我还需要在 WHERE
子句中使用 users
table 加入 swp_from
作为第二个条件。我该怎么做?
简单来说,如果满足第一个 where 条件,我需要使用 swp_to
与 users
table 连接的查询。如果满足第二个 where 条件(在 OR 之后),那么我希望连接使用 swp_from
而不是 swp_to
。这应该发生在每一行。 PHP 条件逻辑解决方法也可以。
条件应移至 ON
子句。
在 MySql 中,CASE
表达式可用于 return 布尔表达式的结果(如 1
或 0
用于 true
或 false
) 像这样:
SELECT u.name, s.swp_to, s.first_swp
FROM swipes s LEFT JOIN users u
ON CASE (s.swp_from = :me AND ((s.first_swp NOT IN ('like', 'superlike')) OR (s.first_swp IN ('like', 'superlike') AND s.second_swp NOT IN ('like', 'superlike'))))
WHEN 1 THEN u.id = s.swp_to
WHEN 0 THEN u.id = s.swp_from AND (s.swp_to = :me AND s.second_swp <> 'pending')
END;