我有一个数据库,其中包含一个人员表和另一个具有这些人员名称的表。对于每个人,姓名表中至少有一条记录,其中一条记录被设置为该人的“ 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.software_title_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 | language_id
--------------------------------
1 | George | 1
2 | Jorge | 2
3 | Джордж | 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
我发现某些预期记录没有通过。我猜想我可以对查询进行一些改进,但是我的技能还不够先进,不足以知道最佳途径。有人可以看到我在做什么错吗?
答案 0 :(得分:0)
我建议您将where子句条件放在select语句中,并为每条记录返回一个“分数”。将其从where子句中完全删除,它可以让您深入了解为什么如果记录返回0时缺少记录。
条件时的情况然后5 当条件为4时 等等... 否则0 结束案例
一旦您对结果进行了评分,就可以按评分递减的顺序进行排序,并按人均排名第一。或添加其他外部查询以仅返回每人得分最高的行。
很抱歉我的手机接听。