我正在尝试为我的应用程序创建查找脚本。当前的表结构如下所示:
id userid profile_field profile_value
-----------------------------------------------------
1 1 firstname John
2 1 lastname Smith
3 1 address 123 anywhere
4 1 city city
5 2 firstname Jane
6 2 lastname Smith
7 2 address 456 anywhere
8 2 city town
我正在尝试编写一个允许我根据用户输入搜索用户的查询。
例如,我的管理员想要搜索姓氏为“smith”的用户。在此示例中,它将返回用户ID 1和2。
这可能与mysql有关吗?到目前为止,我已经研究了mysql的group_concat函数,但似乎它将所有内容放入字符串而不是列中。因此,我无法生成适当的where子句进行搜索。
编辑:我必须道歉,我应该更清楚。我还需要考虑有多个输入。例如,搜索名字如“john”和姓氏“smith”的用户。在此示例中,它仅返回用户ID 1.
这是我遇到麻烦的部分。再次抱歉!
答案 0 :(得分:3)
试试这个:
SELECT group_concat(DISTINCT UserID) as Results
FROM tableName
WHERE profile_value like CONCAT('%', 'Smith' ,'%')
这将返回
Results
==========
1, 2
OR
SELECT UserID as Results
FROM tableName
WHERE profile_value like CONCAT('%', 'Smith' ,'%')
这将返回
Results
==========
1
2
答案 1 :(得分:1)
可能不是最好的解决方案,但我们决定使用cron创建一个可以创建聚合表的工作。然后,我们可以使用聚合表执行查找。
create table profile_values_aggregate
select users.uid,
(SELECT value FROM profile_values WHERE fid=1 and profile_values.uid=users.uid) AS cust_fname,
(SELECT value FROM profile_values WHERE fid=2 and profile_values.uid=users.uid) AS cust_lname
... ... ...
FROM profile_values
inner join users on users.uid=profile_values.uid
GROUP BY uid
答案 2 :(得分:0)
SELECT
`userid`
FROM
`table`
WHERE
`profile_field` = 'lastname'
AND
`profile_value LIKE %smith%;
答案 3 :(得分:0)
试试这样的事情:
SELECT userid FROM table WHERE profile_value='Smith'
答案 4 :(得分:0)
感谢您提供“不是最佳解决方案”。基于此,我想我明白你要做什么。标准方法是将表连接到自身,如下所示:
SELECT pv1.`userid` FROM `profile_value` AS pvfirst
JOIN `profile_value` AS pvlast ON pvfirst.`userid` = pvlast.`userid`
WHERE
pvfirst.`profile_field` = 'firstname'
AND
pvfirst.`profile_value` LIKE '%john%'
AND
pvlast.`profile_field` = 'lastname'
AND
pvlast.`profile_value` LIKE '%smith%'
;
我希望这会有所帮助。如果您有任何后续问题,请不要犹豫。
答案 5 :(得分:0)
这个怎么样?
select userid from profile_values
where
(profile_field = 'firstname' and profile_value = 'John') or
(profile_field = 'lastname' and profile_value = 'Smith')
group by userid
having count(*) = 2
数字2是由OR分隔的条件数量。
修改强>
这似乎适用于“或”,但如果我正在寻找名字为“john”且姓氏为“smith”的某些人,那么它就无效了...... - jellysandwich
工作正常。正如我之前告诉过你的那样,如果数字2是条件对的数量(每对是一个字段 - 值比较),那么只有一个条件应该只有1. Example
select userid from profile_values
where
(profile_field = 'firstname' and profile_value = 'John')
group by userid
having count(*) = 1