我刚刚(6个月以上)开始学习所有的网络语言,主要是在OpenCart的框架内。现在我正在尝试使用语言回退来处理数据库内容。
目标是检查id.title
中的空字段,如果是,请选择默认language_id=1
。
language_id
来自前端用户调用的GET请求。
表description
看起来像这样:
------------------------------------------------------ | information_id | language_id | title | description | ------------------------------------------------------ | 3 | 1 | policy | policy desc | ------------------------------------------------------ | 4 | 1 | about | about desc | ------------------------------------------------------ | 4 | 2 | | | ------------------------------------------------------ | 5 | 1 | terms | terms desc | ------------------------------------------------------ | 6 | 1 | comp | comp desc | ------------------------------------------------------
正如您所看到的,language_id=2
没有标题也没有描述(由sql插入,而不是oc的管理员)。在这种情况下,我想获得具有默认language=1
的行。
我尝试过使用CASE
但结果总是空的。我无法找到解决方案的问题是检查请求的language_id
旁边的标题字段。
在尝试SELECT
之前,我还尝试先检查字段,但没有成功。
SELECT DISTINCT *
FROM information_description id
WHERE id.information_id = '4'
AND id.language_id = (CASE WHEN id.title = '' THEN '1' ELSE '2' END);
任何帮助都将不胜感激。
答案 0 :(得分:0)
这里有两个选择。要么通过子选择执行,要么每次保存/更新执行所有信息描述,并使用默认语言更新缺少的语言。
第一个解决方案可能是:
SELECT id.information_id, id.language_id, id.description,
CASE WHEN id.title IS NOT NULL /* or CASE WHEN id.title <> '' - depending on the real value in DB when it's empty */
THEN id.title
ELSE (SELECT title FROM information_description WHERE language_id = 1)
AS title
FROM information_description id
WHERE id.language_id = 2
我只会在语言ID与默认ID不同的情况下调用此类查询。由于这可能看起来像工作解决方案,我不喜欢它只是因为它增加了数据库的工作量。
除此之外,我建议您以类似的方式更新您的遗失数据(这可能只能在您的生命中完成一次并完成):
UPDATE information_description id SET
id.title = (SELECT title FROM information_description WHERE language_id = 1 AND information_id = id.information_id)
WHERE id.language_id <> 1
AND id.title IS NULL
标题和
UPDATE information_description id SET
id.description = (SELECT description FROM information_description WHERE language_id = 1 AND information_id = id.information_id)
WHERE id.language_id <> 1
AND id.description IS NULL
用于描述字段......