我有一个数据库,其中包含一个人员表和另一个包含这些人员姓名的表。对于每个人,名称表中至少有一条记录,其中一条记录被设置为该人的“person_default_name_id”,但该名称在不同语言中还有其他变体。这个想法是,查找表格的用户将有一个首选语言集(例如英语、西类牙语、俄语)和一个首选脚本集,该脚本集基于他们的首选语言(例如,如果他们的首选语言是英语或西类牙语,则脚本将是“拉丁语”,而如果首选语言是俄语,则脚本将是“西里尔文”)。这有点复杂,我想显示一个名称列表,但只显示每个人一个名称,并且应根据最适合用户选择的语言和脚本显示一个选定的名称。
下面的代码是我正在尝试的:
SELECT
people.person_id,
names.name
FROM
`people`
LEFT JOIN
`names` ON names.person_id=people.person_id
LEFT JOIN
`languages` ON names.language_id = languages.language_id
LEFT JOIN
`language_scripts` ON languages.language_id = language_scripts.language_id
WHERE
(
/* 1st preference - display the default name for the person IF the default name's language writing system matches the user's writing system */
(people.person_default_name_id=names.name_id AND language_scripts.script_id = :user_script_id)
OR
/* 2nd preference - display the alternative name in the user's chosen language if an alternative name exists in that language */
names.language_id = :user_language_id
OR
/* 3rd preference - display the alternative name in the user's chosen writing system if an alternative name exists in that writing system */
language_scripts.script_id = :user_script_id
)
GROUP BY
people.person_id
ORDER BY
names.name ASC
示例数据如下:
表:人员
person_id | person_default_name_id
------------------------------------
1 | 2
表:名称
name_id | name | person_id | language_id
--------------------------------------------
1 | George | 1 | 1
2 | Jorge | 1 | 2
3 | Джордж | 1 | 3
表:语言
language_id | language
------------------------
1 | English
2 | Spanish
3 | Russian
表:语言脚本
language_script_id | language_id | script_id
----------------------------------------------
1 | 1 | 1
2 | 2 | 1
3 | 3 | 2
表:脚本
script_id | script
----------------------
1 | Latin
2 | Cyrillic
我发现一些预期的记录没有出现。我猜测我可以对我的查询进行改进,但我的技能还不够先进,无法知道最佳路径。谁能看出我做错了什么吗?
最佳答案
我建议您将 where 子句条件放入 select 语句中,并为每条记录返回一个“分数”。将其从 where 子句中完全删除,如果返回的分数为 0,它可以让您深入了解为什么缺少记录。
条件Then 5的情况 当条件那么 4 ETC... 否则 0 结束案例
对结果进行评分后,您可以按分数降序排列,并选择每人的第一个。或者添加额外的外部查询以仅返回每人得分最高的行。
很抱歉通过我的手机接听。
关于mysql - 加入查询缺失记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56747014/