mysql - 加入查询缺失记录

标签 mysql

我有一个数据库,其中包含一个人员表和另一个包含这些人员姓名的表。对于每个人,名称表中至少有一条记录,其中一条记录被设置为该人的“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/

相关文章:

mysql - 连接多个表并返回零(如果不是排在一个表中)

javascript - 无法从 jquery 中的值字段传递日期时间

PHP/SQL 使用 LIKE 子句选择

mysql - 将数据从 PostgreSQL 移动到 MySQL 数据库

mysql - 在SQL中计算日期

php - SQL 连接错误 : Connection failed: Unknown MySQL server host 'localhost:3306' (0)

mysql - 在mysql集群中运行mysql

sql - MySQL 语法按餐厅分组,菜单更便宜

mySQL:模式匹配名称中的 3 个或更多 "a' s"

php - 简单的 MySql 查询在 php 中不起作用