如何选择在同一列中出现的相同ID值?

时间:2015-10-07 22:52:11

标签: mysql sql

我在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?

3 个答案:

答案 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的东西。使用您的样本数据进行测试并运作。

它将所有人的标题组合成一个列,将其给定的名称组合到另一个列中,将所有姓氏组合成第三列。它用逗号包装每个列,以确保找到一个特定的名称是准确的。

下面的代码段会找到任何人:

  1. 至少有一个名为“José”和
  2. 的名字
  3. 至少有一个姓氏为“Rojas”
  4. 要找到不同的用户,只需更改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
    
      

    在编辑之前,这可能无法按预期工作。额外的逗号确保搜索到的名称不是子字符串