【问题标题】:How to SELECT same ID of values occuring in the same column?如何选择同一列中出现的值的相同 ID?
【发布时间】:2016-01-05 08:46:29
【问题描述】:

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

【问题讨论】:

  • 你能提供一个期望输出的例子吗?因为只有一个名字就可以得到多个ID。
  • 没关系,我们的目标是让所有与给定名称匹配的人。
  • 在您询问最终结果之前,您还有一个写得很好的问题。向我们展示输入和期望输出的样本,这样我们就不必开始猜测了。
  • 标记你的数据库管理系统
  • @Juan Carlos Oropeza:例如,当我在我的数据库中“询问”一个名为José Laguna 的人时,我希望得到他的完整信息,如上例所示。输入将是他的名字和姓氏之一,输出将是他的完整信息。

标签: mysql sql


【解决方案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é'

【讨论】:

  • 在这种情况下,不,因为当我搜索 josé Laguna 时,只显示两个名字的人,而不是只有给定名字之一的人。
  • 您是说值列名称为“josé Laguna”,还是说值列名称为“josé”而另一列包含“Laguna”?
  • 不,名称都在同一列中,但在不同的行中列出并且具有相同的 ID。
  • 我更新了我的答案,我认为这就是你要找的。​​span>
  • 是的,是的!谢谢!! :-) 只剩下一个问题:当我想根据更多名称进行 SELECT 时,是否需要进行多个连接?就像三个名字的两个连接,或者四个名字的三个连接,或者我正在搜索的每个名字的一个 JOIN 语句?或者有更好的名称变量计数解决方案吗?
【解决方案2】:

我使用José 你可以使用变量@searchText

 SELECT *
 FROM YourTable
 WHERE ID IN (SELECT DISTINCT ID
              FROM YourTable
              WHERE value = 'José')

如果有多个参数,也可以使用IN

              WHERE value IN ('José', 'Laguna')

【讨论】:

  • 这与我正在搜索的内容非常接近。但它应该只选择有两个名字的人,而不是那些只有一个名字的人。它应该列出每个人,他们被称为José Laguna
  • 明白我为什么说准备好你的愿望输出了吗?这让我觉得我在浪费时间。我会考虑这是我对这个问题的最终答案,特别是因为你说这是exactly 你想要的。如果您在另一个问题中准备更好的样本,我也可以回答您的其他情况。因为现在您需要多个参数,并且必须明确是一个数组中的参数,还是另一个表中的参数或多个变量。
  • 我很抱歉不够精确......不过我真的尽力解释了......
  • 为了将来参考你应该阅读Need an Answer? Actually, No ... You Need a Question
【解决方案3】:

所以这里使用GROUP_CONCAT。使用您的示例数据和作品进行了测试。

它将人的所有头衔归为一列,他们的名字归为另一列,他们的所有姓氏归为第三列。它用逗号包裹每一列,以确保找到特定名称是准确的。

下面的 sn-p 会找到符合以下条件的任何人:

  1. 至少有一个名字叫“José”并且
  2. 至少有一个姓氏“Rojas”

要找到其他用户,您只需更改 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

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

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多