Mysql 如果联接字段具有值,则执行联接

Mysql 如果联接字段具有值,则执行联接,mysql,join,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,以此类推 值A根据特定条件设置。在任何其他情况下,

在谷歌搜索和查看之后,我为一种特定类型的查询找到了一个不可行的解决方案。我有一个表,用于转换文本中另一个表的值。比如说:

id - text
1 - House
2 - Villa
3 - Camper
主桌是

id - valueA - valueB - valueC
1 - 1 - whastington - 3000
2 -  - NewYork - 5000
因此,如果我获取主表的frm行,我会将valueA的值从1替换为House,以此类推

值A根据特定条件设置。在任何其他情况下,该字段将保留为空(该字段不应为空)

如果我进行连接,第二行将被忽略,因为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 <>'')
从主菜单中选择id、文本、值B、值C
连接dic ON(main.valueA=dic.id和main.valueA“”)
正如我读到的,但我没有得到我想要的,可能是因为在这种情况下,AND条件是基于另一个字段,而不是基于连接的字段。我可以在dictionary表中添加另一行,并将所有空值a都转换为0,但我想了解我的查询是否在正确的路径上,以及我做错了什么。这种所谓的“条件连接”在mysql中是可能的吗?
我也看了一下,但是这个解决方案会使这个查询变得太复杂,在这种情况下,我会选择用0替换空的“方案B”

使用
联合
连接
与一个查询相结合,该查询将所有行的
值都为空

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 = ''

使用
UNION
JOIN
与一个查询组合起来,该查询获取所有
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 = ''

使用
UNION
JOIN
与一个查询组合起来,该查询获取所有
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 = ''

使用
UNION
JOIN
与一个查询组合起来,该查询获取所有
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 = ''

我不明白你的目标。在我看来,您只需要
左加入

SELECT main.id,
  dic.text,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id
更新如果您想在查询结果中查看
dic.id
,只需在
中添加该字段,选择
部分以及
中的
值a
,如果需要:

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只是列的别名,您可以设置自己的名称或将其保留为空。

我无法理解您的目标。在我看来,您只需要
左加入

SELECT main.id,
  dic.text,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id
更新如果您想在查询结果中查看
dic.id
,只需在
中添加该字段,选择
部分以及
中的
值a
,如果需要:

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只是列的别名,您可以设置自己的名称或将其保留为空。

我无法理解您的目标。在我看来,您只需要
左加入

SELECT main.id,
  dic.text,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id
更新如果您想在查询结果中查看
dic.id
,只需在
中添加该字段,选择
部分以及
中的
值a
,如果需要:

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只是列的别名,您可以设置自己的名称或将其保留为空。

我无法理解您的目标。在我看来,您只需要
左加入

SELECT main.id,
  dic.text,
  main.valueB,
  main.valueC 
FROM main 
LEFT JOIN dic 
on main.valueA =  dic.id
更新如果您想在查询结果中查看
dic.id
,只需在
中添加该字段,选择
部分以及
中的
值a
,如果需要:

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只是列的别名,您可以设置自己的名称或将其留空。

您也可以使用子查询来完成此操作(或左联接)


您还可以使用子查询来执行此操作(或左连接)


您还可以使用子查询来执行此操作(或左连接)


您还可以使用子查询来执行此操作(或左连接)


如果我理解正确,我认为您需要一个左外部联接,但要使用If为valueA列返回不同的值(valueA或文本)

大概是这样的:-

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

如果我理解正确,我认为您需要一个左外部联接,但要使用If为valueA列返回不同的值(valueA或文本)

大概是这样的:-

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

如果我理解正确,我认为您需要一个左外部联接,但要使用If为valueA列返回不同的值(valueA或文本)

大概是这样的:-

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

如果我理解正确,我认为您需要一个左外部联接,但要使用If为valueA列返回不同的值(valueA或文本)

大概是这样的:-

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


示例数据的预期结果是什么?我想从main中选择两行。使用普通联接时,我错过了第2行。示例数据的预期结果是什么?我想从main中选择两行。使用普通联接时,我错过了第2行。示例数据的预期结果是什么?我想从main中选择两行。使用普通联接时,我错过了第2行。示例数据的预期结果是什么?我想从main中选择两行。使用普通连接时,我忽略了第2行的优点,但为什么还要添加main.valueA!=''呢在第一个选择中?我想它是多余的,但它使意图更清楚。啊,好的。谢谢你的提示!很好,但为什么还要添加main.valueA!=''在第一个选择中?我想它是多余的,但它使意图更清楚。啊,好的。谢谢你的提示!很好,但为什么还要添加main.valueA!=''在第一个选择中?我想它是多余的,但它使意图更清楚。啊,好的。谢谢你的提示!很好,但为什么还要添加main.valueA!=''在第一个选择中?我想它是多余的,但它使意图更清楚。啊,好的。谢谢你的提示!对左连接是另一种选择。但如果条件不是“非空”而是“非特定值”?你必须在没有其他选项的情况下将其置于where条件下吗?@LelioFaieta它适用于没有出现在
dic.id
中的任何值。如果在dic.id中,我有1,2和3,我只想连接1和2,然后离开