MySQL加入和默认

时间:2014-12-12 16:16:03

标签: mysql sql

我对SQL查询仍然很陌生,并且不能很好地解决这个问题。

我有两个表,一个表我正在运行一般SELECT ... WHERE,超级简单的SQL语句。

例如:

SELECT * from maindata where somedata4 LIKE "%data4.%"

这给了我一个下面所有6个条目的列表,但是我想要一个额外的列来显示当前userdata.userId是否有匹配的行并包含其中的amount列。如果它没有将该行默认为值0。

表:maindata

id | somedata | somedata2 | somedata3 | somedata4
_________________________________________________
1  | data1.1  | data2.1   | data3.1   | data4.1
2  | data1.2  | data2.2   | data3.2   | data4.2
3  | data1.3  | data2.3   | data3.3   | data4.3
4  | data1.4  | data2.4   | data3.4   | data4.4
5  | data1.5  | data2.5   | data3.5   | data4.5
6  | data1.6  | data2.6   | data3.6   | data4.6

表:userdata

id | itemId | amount | userId
_____________________________
1  | 6      | 4      | 1
2  | 4      | 4      | 26
3  | 4      | 2      | 1

它应该搜索WHERE somedata4 LIKE "%data4.%"的表 maindata ,并且每个条目都会在表{strong> userdata 中查找userdata.amount maindata.id = userdata.itemId WHERE maindata.userId = 1

这是我目前对SQL的看法

SELECT m.*, IFNULL(u.amount,0)
from maindata m
LEFT OUTER JOIN userdata u ON m.id = u.itemId
WHERE m.somedata4 LIKE "%data4.%"

我缺少的是仅过滤userdata.userId = 1中的金额,我希望整个列表显示在该查询中。

预期结果:

id | somedata | somedata2 | somedata3 | somedata4 | amount
__________________________________________________________
1  | data1.1  | data2.1   | data3.1   | data4.1   | 0
2  | data1.2  | data2.2   | data3.2   | data4.2   | 0
3  | data1.3  | data2.3   | data3.3   | data4.3   | 0
4  | data1.4  | data2.4   | data3.4   | data4.4   | 4
5  | data1.5  | data2.5   | data3.5   | data4.5   | 0
6  | data1.6  | data2.6   | data3.6   | data4.6   | 2

3 个答案:

答案 0 :(得分:1)

SELECT m.*, IFNULL(u.amount,0) from maindata m LEFT OUTER JOIN
  userdata u ON m.id = u.itemId WHERE m.userId = 1

答案 1 :(得分:0)

我试过这个解决方案,但我不确定这是不是你要找的。让我知道。

-------编辑--------

现在我确定你在寻找什么。我只有几分钟,所以我没有真正优化代码,但这似乎工作除了字段的顺序,由于我们在两组不同的结果中运行,因此无法真正修改。

顺便说一下,这是查询

SELECT m.*, '0' as amount
from maindata m
left outer JOIN userdata u ON m.id = u.itemId
where (u.userid is null) and m.somedata4 LIKE '%data4.%'

UNION

SELECT m.*, u.amount
from maindata m
inner JOIN userdata u ON m.id = u.itemId
where u.userid = 1 and m.somedata4 LIKE '%data4.%'

这是updated fiddle

希望这有帮助。

答案 2 :(得分:0)

这是我正在寻找的SQL查询(我认为):

SELECT m.*, IFNULL(u.amount,0) AS "Amount"
FROM maindata m
LEFT OUTER JOIN userdata u ON m.id = u.itemId AND userid = 1
WHERE m.somedata4 LIKE "%data4.%"

它给了我上面列出的预期结果,我只是不知道它是否是处理此请求的最有效方式。

SQLFiddle Here