phpmyadmin 多语言页面-如果存在,则获取language ='de'行,否则从MySQL数据库获取language ='en'行

fae0ux8s  于 2022-12-13  发布在  PHP
关注(0)|答案(2)|浏览(126)

我有以下名为'content'的SQL表:
| 语言|内容ID|正文|
| - -|- -|- -|
| 英文|一个|你好|
| 鹿|一个|哈罗|
| 英文|2个|世界|
我的目标是查询与language ='de'匹配的所有行。
但如果存在language ='en'的行,而该行没有language ='de'的计数器部分,我希望将其包含在查询结果中。
我期望的输出是:
| 内容ID|正文|
| - -|- -|
| 一个|哈罗|
| 2个|世界|
这个问题是在设计多语言页面时出现的。我的查询应该防止在“de”页面上没有显示文本,而是显示默认的“en”文本。
我尝试使用CASE和EXISTS语句解决此问题,但没有成功。

mpgws1up

mpgws1up1#

SELECT en.contentId, IFNULL(de.text,en.text) AS thetext
FROM content en
LEFT JOIN content de ON en.contentId=de.contentId AND de.language='de'
WHERE en.language='en'

这是一个LEFT JOIN,如果不为空,它总是提取一个带有'de'语言的值,否则它获取带有相同contentId但带有'en'语言的行。
或者更好地解释一下,它假设contentId的所有值都有一行是“en”语言,并且它会将它们中的每一个与一行连接,该行具有相同的contentId,但在“de”中(如果存在)。如果存在,它会从“de”中提取文本,否则从“en”中提取文本。
让我知道它是否工作,它是足够清楚。否则你应该熟悉LEFT JOINshttps://www.w3schools.com/sql/sql_join_left.asp

ztmd8pv5

ztmd8pv52#

我设法提出了以下解决方案,它不使用JOIN

SELECT DISTINCT contentId as id, 
CASE
    WHEN (SELECT language FROM content WHERE contentId = id AND language = 'de') = 'de' THEN (SELECT text FROM content WHERE contentId = id AND language = 'de')
    ELSE (SELECT text FROM content WHERE contentId = id AND language = 'en')
END as text
FROM content

它看起来像是上述答案的有效替代方案(可能效率较低?)

相关问题