首页 > 解决方案 > 在 where 子句中使用左连接和 AND 和 OR 组合的 mysql 查询

问题描述

我有两张桌子,table1table2LEFT JOINed。两个表上都应该有一个包含ANDOR条件的查询。最好在一个查询中。我知道我可以做几个查询并与 id 数组相交(使用 PHP)但是......


table1

id     email    status
1      a@one    1
2               1
3      b@two    1
4      c@three  0
5      d@four   1
6      e@five   1

table2

ix   t_id    type     value
1    1       1        Miller
2    1       2        10001
3    1       3        x
4    1       5        y
5    2       1        Miller
6    2       2        20002
7    2       3        x
8    3       1        Muller
9    3       2        10002
10   3       5        x
11   4       1        Mayer
12   4       2        10002
13   4       3        x
14   5       1        Moore
15   5       2        10234
16   6       1        Zlo
17   6       2        12345
18   6       3        x
19   6       5        x

我需要一个查询,我想要所有活跃人员的 id ( status=1),其中有一封电子邮件 (all in table1),人名 (类型 1) 必须以 M 开头,邮政编码 (类型 2) 必须以他们拥有AND的 1 开头AND类型 3 是 xOR类型 5 是 x (all in table2)。

EITHER type = 3 OR type = 5如果没有条目,则不应返回 id 。

type = 3如果不返回type = 5任何值,则不应返回 idx


在我的例子中:

t_id 4 (Mayer) 不活跃,所以他不应该出现在结果中
t_id 2 (Miller) 没有电子邮件,所以他不应该出现在结果中
t_id 5 (Moore) 没有类型 3,也没有类型 5,所以他不应该出现在结果中
t_id 6 (Zlo) 名字不以 M 开头,所以他不应该出现在结果中

我设法写了这样的东西,但它在所有零行中都不起作用:

SELECT id 
FROM table2 
    LEFT JOIN table1 ON (t_id = id WHERE email LIKE '%@%' AND status = '1') 
WHERE (type = 1 and value LIKE 'M%') 
AND (type = 2 AND value LIKE '1%') 
AND ((type = 3 AND value = 'x') OR (type = 5 and value = 'x'))

任何帮助,将不胜感激!

谢谢你里格斯愚蠢

在很好的帮助之后它会(并且有效)

SELECT id 
FROM table2 
LEFT JOIN table1 ON table2.userid = table1.id 
AND status = 1 AND email LIKE '%@%' 
WHERE ( 
(type = 3 AND value = 'X') 
OR (type = 5 AND value = 'X') 
) 

table2无法集成的附加条件将是单独的查询:

SELECT id 
FROM table2 
LEFT JOIN table1 ON table2.userid = table1.id 
AND status = 1 AND email LIKE '%@%' WHERE (type = 1 AND value LIKE 'G%')

SELECT id 
FROM table2 
LEFT JOIN table1 ON table2.userid = table1.id 
AND status = 1 AND email LIKE '%@%' WHERE (type = 2 AND value LIKE '1%')

标签: mysqlleft-joincombinationswhere-clause

解决方案


具体类型不能是 1 和 2 和 3,但可以是 1 或 2 或 3

SELECT id 
FROM table2 t2
    LEFT JOIN table1 t1 ON t2.t_id = t1.id AND status = '1'
WHERE t1.email LIKE '%@%'
AND (
        (t2.type = 1 and t2.value LIKE 'M%') 
    OR  (t2.type = 2 AND t2.value LIKE '1%') 
    OR  (t2.type = IN(3,5) AND t2.value = 'x')
    )

推荐阅读