【问题标题】:How could I make a fullname search work with a seperate last and firstname?如何使用单独的姓氏和名字进行全名搜索?
【发布时间】:2022-01-03 19:40:06
【问题描述】:

我是 SQL 新手,我正在尝试进行基本查询。

这是我要搜索的表格及其布局: https://prnt.sc/20wj54g

我的目标是有一个搜索词输入,然后让输入用于按全名搜索数据库中的名称。

这是我现在的当前查询:

SELECT *
FROM personnel p
LEFT JOIN department d ON (d.id = p.departmentID)
LEFT JOIN location l ON (l.id = d.locationID)
WHERE p.firstName LIKE '%Robert Heffron%' OR p.lastName LIKE '%Robert Heffron%';

这不起作用,因为没有包含整个字符串“Robert Heffron”的姓氏或名字,但这意味着如果用户输入该字符串以查找该人的全名,他们将找不到他们。

我目前正在使用 PHP 和 JS 来显示数据,但我正在努力处理 SQL 部分。 如果有人能提供帮助,我将不胜感激。

【问题讨论】:

  • 如果您可以在 PHP 中访问此人的姓名。您可以尝试用空格分隔它并使用 where-in 子句。 WHERE p.firstName IN ('Robert','Heffron') AND p.lastName IN ('Robert','Heffron') 我们使用 AND 而不是 OR 来避免像“John Heffron”或“Robert Williams”这样的结果。

标签: mysql sql sql-like


【解决方案1】:

我建议在您的数据库表中添加一个全名字段,并且每当您在代码中创建“人员”时,将名字和姓氏连接起来:

Fullname = Firstname + " " + Lastname

如果你不喜欢这样,可以使用一个字符串拆分函数(在 php 中它可能是 .explode()),然后为每个子字符串添加 WHERE OR 语句以获取名字和姓氏。

【讨论】:

  • 您好,感谢您的建议,但我无法编辑 SQL 表,因为它不允许用于我被分配执行的操作。否则是一个很好的解决方案。
【解决方案2】:

使用以下组合查找姓名为Robert且姓氏为Heffron

的人

只要找到罗伯特·赫夫隆

WHERE p.firstName LIKE '%Robert%' AND p.lastName LIKE '%Heffron%';

查找所有带有 Robert 的名字和所有带有 Heffron

的姓氏
WHERE p.firstName LIKE '%Robert%' OR p.lastName LIKE '%Heffron%';

【讨论】:

  • 对不起,如果措辞不明确,但我无法分开,因为这将是用户文本输入,这意味着 like = '%userInput% 需要相同'
【解决方案3】:

您可以对列使用 concat,并且可以在连接列上使用“HAVING”子句。我希望它对你有用。

SELECT * FROM personnel p LEFT JOIN department d ON (d.id = p.departmentID) LEFT JOIN location l ON (l.id = d.locationID) HAVING CONCAT(firstName,' ',lastName) LIKE '%Robert Heffron%';

我希望这个 sn-p 对你有用。

【讨论】:

  • 在没有GROUP BY 的查询中使用HAVING 是有问题的,according to the docs 会导致性能下降。
【解决方案4】:

一种不要求您更改表格并且只有一个输入变量的解决方案可能是这样的:

DECLARE @FullName AS VARCHAR(100)
SET @FullName = 'Robert Heffron'
SET @FullName = REPLACE(@FullName, ' ', '.')
SELECT....
WHERE p.firstname LIKE '%'+ ParseName(@FullName, 2) + '%' OR 
    p.firstname LIKE '%'+ ParseName(@FullName, 1) + '%' OR 
    p.lastnameLIKE '%'+ ParseName(@FullName, 2) + '%' OR 
    p.lastname LIKE '%'+ ParseName(@FullName, 1) + '%'

在我看来,如果用户在名称中输入了奇怪数量的空格,则缺点是。我已经测试用一个不可能的数字(如 7)替换 ParseName 中的数组编号 1 或 2,它基本上只是忽略它.. 没有抛出错误或其他任何错误。如果你使用它,你可以在你身边测试它以确保你。

【讨论】:

  • 只用你输入的c替换第一个'Robert Heffron'
【解决方案5】:

这不是一个很好的性能解决方案,但如果你想只使用 SQL 解决问题,你可以试试这个:

SELECT *
FROM personnel p
LEFT JOIN department d ON (d.id = p.departmentID)
LEFT JOIN location l ON (l.id = d.locationID)
WHERE LOWER(CONCAT(p.firstName, p.lastName)) LIKE LOWER(REPLACE('%Robert Heffron%', ' ', '%'))
OR LOWER(CONCAT(p.lastName, p.firstName)) LIKE LOWER(REPLACE('%Robert Heffron%', ' ', '%'));

字段拼接用于查找拼接的输入值,OR拼接的不同组合用于独立于输入名字和姓氏的顺序。转换为小写 - 用于不区分大小写的搜索。我们用% 字符替换空格来搜索连接的字段值,而不必担心空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多