2011-08-30 67 views
0

如何列出性别=男人和女性= 19岁的女性和女性的IDuser?在加入mysql时列出结果

Table usermeta 
---------------------- 
id iduser a  b 
12 204 age  19 
7 203 age  35 
6 200 age  24 
3 201 age  34 
5 201 gender male 
2 200 gender female 
8 203 gender male 
9 204 gender male 
4 201 int  female 
10 204 int  male 
11 203 int  female 
1 200 int  male 

答案应该是:

ID用户

我得到这个从另一个帖子...

SELECT a.`iduser` FROM `table` a 
JOIN `table` b ON b.`iduser` = a.`iduser` 
WHERE a.`a`='gender' AND a.`b`='man' AND b.`a`='int' AND b.`b`='woman' 

,但不会过滤年龄字段。 ..

谢谢。

+2

什么样的病表的设计是? – emboss

+0

是wordpress的usermeta表格。我不能改变它。 – alejoabella

+0

永不使用WordPress的好理由。 –

回答

1

这里的另一个替代扔到组合:

SELECT user_id 
    FROM wp_usermeta 
    WHERE (meta_key = 'age' AND meta_value = '19') 
    OR (meta_key = 'gender' AND meta_value = 'male') 
    OR (meta_key = 'int' AND meta_value ='male') 
    GROUP BY user_id 
    HAVING COUNT(*) = 3 
0

看起来你需要另一个自我加入,我们将其别名为t3。另外,我正在将别名从a,b更改为t1,t2,因为您的示例完全不可读。 DISTINCT可能会或可能不需要。

SELECT DISTINCT t1.`iduser` 
FROM `table` t1 
    JOIN `table` t2 ON t1.`iduser` = t2.`iduser` 
    JOIN `table` t3 ON t1.`iduser` = t3.`iduser` 
WHERE 
    t1.`a` = 'gender' 
    AND t1.`b` = 'man' 
    AND t2.`a` = 19 
    AND t3.`b` = 'woman' 
+0

我尝试但不工作...没有任何回报。 – alejoabella

0

你可以尝试这样的事情,但我认为它会工作的很慢。

SELECT iduser, GROUP_CONCAT(CONCAT(a,':',b) SEPARATOR ',') as groups 
from TABLE 
group by iduser 
having LOCATE('gender:man', groups) != 0 and LOCATE('int:woman', groups) != 0 and LOCATE('age:19', groups) != 0 

我没有检查这一项上真实的数据,所以如果任何错误发生在评论放下他们。

另一种方式:

SELECT t1.iduser from table t1 
INNER JOIN table t2 on t1.iduser=t2.iduser and t1.a='age' and t2.a='gender' 
INNER JOIN table t3 on t2.iduser = t3.iduser and t3.a='int' 
where t1.b='19' and t2.b='man' and t3.b='woman'; 
+0

这个工作很好,谢谢! 我需要在一个大的wordpress数据库中使用它。 这可能会工作缓慢? – alejoabella

+1

我认为是的。在此查询上运行解释 –

+0

@alejoabella检查来自帖子的另一个查询。 –