【问题标题】:Using an IF in a Mysql query在 Mysql 查询中使用 IF
【发布时间】:2013-04-19 15:33:32
【问题描述】:

我有两个包含数百万条记录的表,我需要将它们连接起来以显示不同语言的结果。我希望使用带有 IF 条件的查询来创建视图,但我无法理解哪种方法是正确的。

我需要做的是:如果以下选择对于单行有 NULL(换句话说,该行没有德文翻译)...

SELECT one, two FROM tableA A LEFT JOIN tableB B ON (A.id=B.id) WHERE language='de' order by xyz

...然后在同一行取英文版本,然后选择:

SELECT one, two FROM tableA A LEFT JOIN tableB B ON (A.id=B.id) WHERE language='en' order by xyz

谢谢! 卢卡

【问题讨论】:

  • MySql 不是特别了解,但它有@@rowcount 功能吗?

标签: mysql conditional-operator


【解决方案1】:

您的查询很难理解,因为您没有别名。我假设它的结构是这样的:

select a.one. b.two
from tableA a left join
     tableb b
     on a.id = b.id
where b.language = 'de'
order by xyz

以下提供了应该在 MySQL 中工作的逻辑:

SELECT a.one, 
       (case when (select COUNT(*) from b where b.id = a.id and b.language = 'de' and b.two is null) = 0
             then bde.two
             else bend.two
        end) as two
FROM tableA A LEFT JOIN
     tableB Bde
     ON (A.id=B.id) and
        bde.language='de' left join
     tableB ben
     on ben.language = 'en'
order by xyz

这是假设 NULL 值存储在 B 表中。如果它通过连接丢失,则有点困难,例如:

SELECT a.one, 
       (case when (select COUNT(*) from a a2 join b b2 on a2.id = b2.id and b2.language = 'de' and b2.two is null) = 0
             then bde.two
             else bend.two
        end) as two
FROM tableA A LEFT JOIN
     tableB Bde
     ON (A.id=B.id) and
        bde.language='de' left join
     tableB ben
     on ben.language = 'en'
order by xyz

【讨论】:

  • 非常感谢您的帮助。我以这种方式更改了查询SELECT g.geonameid, alternateName, latitude, longitude, fclass, fcode, country FROM geoname g LEFT JOIN alternatename a ON (g.geonameid=a.geonameid) WHERE IF(select COUNT(*) from geoname g JOIN alternatename a ON g.geonameid=a.geonameid and isoLanguage='de', 1, 0)=1 THEN isolanguage='de' ELSE isolanguage='en' order by isPreferredName,但我在 WHERE if(select... 我尝试了您的查询但没有成功。
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多