如何将分组行数据转换为列进行查找?

时间:2012-02-11 14:22:43

标签: mysql

我正在尝试为我的应用程序创建查找脚本。当前的表结构如下所示:

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.

这是我遇到麻烦的部分。再次抱歉!

6 个答案:

答案 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

查询构思来自此处:https://stackoverflow.com/a/7976379/1203831

答案 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