我可以在MySQL的JOIN子句中加上条件吗?

时间:2011-03-09 06:56:44

标签: sql

例如,假设我有以下连接

join on p.match_id = o.match_id

我可以指定,如果p.match_id是偶数

join on p.match_id = o.match_id - 1

但如果它是奇怪的那么

join on p.match_id = o.match_id + 1

我有顺序match_id,连续值代表一个匹配。因此,为了给出一个给定的match_id的对手,我需要上面的

3 个答案:

答案 0 :(得分:4)

如果您想将一张桌子加入另一张桌子,而第二张桌子的ID只是偶数,请尝试:

JOIN ON p.match_id = o.match_id AND o.match_id % 2 = 0

或第二个表的ID是奇数:

JOIN ON p.match_id = o.match_id AND o.match_id % 2 = 1

答案 1 :(得分:4)

编辑所以它不使用CASE。子查询返回一个包含一个字段的表:matchid(当match_id为偶数时等于match_id + 1,当match_id为奇数时等于match_id-1)。

SELECT matchid
  FROM ( SELECT match_id + 1 - 2*(match_id % 2)
                AS matchid
           FROM p
       ) AS p2
  JOIN o
    ON p2.matchid = o.match_id
;

既然你提到你正在为一对对手使用一个表和两个序列id,你也可以使用以下作为子查询或视图:

SELECT match_id
     , ((match_id + 1) DIV 2) AS pair
  FROM p
;

它将为您提供一个表格,然后您可以自行收集:

| match_id | pair |
|     1    |   1  |
|     2    |   1  |
|     3    |   2  |
|     4    |   2  |
|     5    |   3  |
|     6    |   3  |

答案 2 :(得分:1)

我认为如果您只希望加入p.match_id个值,那么您需要做的有点不同:

join on p.match_id = o.match_id and p.match_id = p.match_id div 2 * 2

同样,如果他们应该是奇怪的:

join on p.match_id = o.match_id and p.match_id = p.match_id div 2 * 2 + 1

但和其他人一样,我很好奇为什么你需要那个。 id列只是id列。通常,您不应该对id列的特定特征感兴趣。