如果连接字段具有值,则执行JOIN

时间:2015-09-02 15:51:14

标签: mysql join

在谷歌搜索并查看之后,我找到了一个针对特定类型查询的无法解决方案。我有一个表用于转换文本中另一个表的值。让我们说:

id - text
1 - House
2 - Villa
3 - Camper

,主表是

id - valueA - valueB - valueC
1 - 1 - whastington - 3000
2 -  - NewYork - 5000

因此,如果我在主表中获取行frm,我将valueA的值从1替换为House,依此类推。

ValueA根据特定条件设置。在任何其他情况下,它将留空(该字段不是NULL)。

如果我进行连接,第二行将被省略,因为valueA为空。查询是

SELECT id,text,valueB,valueC FROM main JOIN dic on main.valueA =  dic.id

所以我试着说: 仅当valueA不为空时才执行加入 我把这个条件写成:

SELECT id,text,valueB,valueC FROM main 
JOIN dic ON (main.valueA =  dic.id AND main.valueA <>'')

当我在this question中读到但我没有得到我想要的东西,可能是因为那个案例中的AND条件是基于另一个字段而不是连接字段。我可以在字典表中添加另一行0-NONE对,并将所有空值A变为0,但我想知道我是否在我的查询的正确路径上以及我做错了什么。这个所谓的“条件连接”在mysql中是可能的吗? 我也看了一下this question,但是这个解决方案会使这个查询过于复杂而且在这种情况下,我会选择用0替换空的“计划B”

4 个答案:

答案 0 :(得分:3)

我无法理解你的目标。在我看来,你只需要LEFT JOIN

SELECT main.id,
  dic.text,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id

更新如果您想在查询结果中看到dic.id,只需在SELECT部分添加该字段,并valueA添加main如果需要:

SELECT main.id,
  dic.text,
  dic.id DIC_ID,
  main.valueA MAIN_VALUEA,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id

DIC_ID和MAIN_VALUEA只是列的别名,您可以设置自己的名称或将其留空。

答案 1 :(得分:0)

使用UNIONJOIN与查询相结合,该查询将所有行显示为空valueA

SELECT id, text, valueB, valueC
FROM main
JOIN dic ON main.valueA != '' AND main.valueA = dic.id
UNION
SELECT id, '', valueB, valueC
FROM main
WHERE main.valueA = ''

答案 2 :(得分:0)

您也可以使用子查询来执行此操作(或LEFT JOIN)

print "'{}'".format("','".join(lst))

答案 3 :(得分:0)

如果我理解正确,我认为你需要LEFT OUTER JOIN,但是然后使用IF为valueA列返回不同的值(值a或文本)

这样的事情: -

SELECT main.id,
        IF(dic.id IS NULL, main.valueA, dic.text)
        main.valueB,
        main.valueC 
FROM main 
LEFT OUTER JOIN dic on main.valueA =  dic.id