我在MySQL中有一个表names
,其中包含以下列ID, type, row, value
复合主键为ID, type, row
此表的目的是将指定人员的所有姓名和职业保存在多行中 - 每行一个数据。
例如:通常在西班牙,人们有两个名字和两个姓氏,如José Anastacio Rojas Laguna
。
在德国,有许多人有一个名字,但有两个姓氏。甚至是广泛职业的人,比如在大学教学和同时在医院做医生。在这种情况下,在德国,人们的名字会落后Prof. Dr.
。例如:Prof. Dr. José Anastacio Rojas Laguna
在这种情况下,我会将所有这些信息存储在表格中:
ID | type | row | value
1 | 0 | 1 | Prof.
1 | 0 | 2 | Dr.
1 | 1 | 1 | José
1 | 1 | 2 | Anastacio
1 | 2 | 1 | Rojas
1 | 2 | 2 | Laguna
为一个人提供ID
。表格中的每个人都有一个唯一的ID
,甚至一个人都由他的ID
标识。 type
定义了名称的类型。 0
表示专业,1
表示名字,2
表示姓氏。 row
定义名称中的位置。 1
表示第一个名字,2
表示第二个名字,3
表示第三个名字,等等......专业和姓氏相同。
现在我想知道如何通过传递那个人的一些名字来选择指定人物的ID
?如何通过仅提供一些值来确定ID,这些值全部(或具有)相同的ID?
答案 0 :(得分:1)
这将返回名称为JoséLaguna且具有相同ID的用户:
select t1.id, t1.name, t2.name
from yourTable t1
join (select * from yourTable
where name = 'Laguna') t2
on t1.id = t2.id
where t1.name = 'José'
答案 1 :(得分:0)
我使用José
您可以使用变量@searchText
SELECT *
FROM YourTable
WHERE ID IN (SELECT DISTINCT ID
FROM YourTable
WHERE value = 'José')
如果有多个参数
,也许可以使用IN
WHERE value IN ('José', 'Laguna')
答案 2 :(得分:0)
所以这是使用GROUP_CONCAT的东西。使用您的样本数据进行测试并运作。
它将所有人的标题组合成一个列,将其给定的名称组合到另一个列中,将所有姓氏组合成第三列。它用逗号包装每个列,以确保找到一个特定的名称是准确的。
下面的代码段会找到任何人:
要找到不同的用户,只需更改WHERE子句即可。
SELECT n.ID,n.type,n.row,n.value
FROM names n
INNER JOIN (
SELECT ID
FROM (
SELECT ID
,CONCAT(',',GROUP_CONCAT((CASE WHEN type=0 THEN value ELSE NULL END) ORDER BY value ASC),',') AS titles
,CONCAT(',',GROUP_CONCAT((CASE WHEN type=1 THEN value ELSE NULL END) ORDER BY value ASC),',') AS givenNames
,CONCAT(',',GROUP_CONCAT((CASE WHEN type=2 THEN value ELSE NULL END) ORDER BY value ASC),',') AS familyNames
FROM `names`
GROUP BY ID
) grouped
WHERE grouped.givenNames LIKE '%,Jose,%' AND grouped.familyNames LIKE '%,rojas,%'
) people ON n.ID = people.ID
在编辑之前,这可能无法按预期工作。额外的逗号确保搜索到的名称不是子字符串