2

首先,请原谅这个非常模糊/冗长的问题,我真的不确定如何在没有完整解释的情况下总结我的查询。

好的,我有一个 MySQL 表,格式如下

一些表

  • 用户身份
  • some_key
  • 一些值

如果您想象,对于每个用户,有多个行,例如:

1   |  skill   |   html
1   |  skill   |   php
1   |  foo     |   bar
2   |  skill   |   html
3   |  skill   |   php
4   |  foo     |   bar

如果我想找到所有将 HTML 列为技能的用户,我可以简单地执行以下操作:

SELECT user_id
FROM some_table
WHERE some_key = 'skill' AND some_value='html'
GROUP BY user_id

很容易。这会给我用户 ID 的 1 和 2。

如果我想找到所有将 HTMLPHP 列为技能的用户,那么我可以这样做:

SELECT user_id
FROM some_table
WHERE (some_key = 'skill' AND some_value='html') OR (some_key = 'skill' AND some_value='php')
GROUP BY user_id

这会给我使用 ID 的 1、2 和 3。

现在,我正在努力解决的是如何查询同一个表,但这次说“给我所有将 HTMLPHP 列为技能的用户”,即:只有用户 ID 1。

非常感谢任何建议、指导或文档链接。

谢谢。

4

3 回答 3

2

这是一种方法:

SELECT user_id
FROM some_table
WHERE user_id IN (SELECT user_id FROM some_table where (some_key = 'skill' AND some_value='html'))
AND user_id IN (SELECT user_id FROM some_table where (some_key = 'skill' AND some_value='php'))
于 2012-04-17T15:33:01.943 回答
1

我不知道这是否对mysql有效,但应该是(适用于其他数据库引擎):

 SELECT php.user_id 
 FROM some_table php, some_table html 
 WHERE php.user_id = html.user_id 
   AND php.some_key = 'skill' 
   AND html.some_key = 'skill' 
   AND php.some_value = 'php' 
   AND html.some_value = 'html';

或者,通过使用 HAVING 语句:

SELECT user_id, count(*) 
FROM some_table 
WHERE some_key = 'skill' 
  AND some_value in ('php','html') 
GROUP BY user_id 
HAVING count(*) = 2;

第三种选择是使用内部选择。大卫方法的一种替代方法:

SELECT user_id FROM some_table
WHERE 
   some_key = 'skill' AND
   some_value = 'html' AND
   user_id IN (
       SELECT user_id FROM some_table 
       WHERE 
           some_key = 'skill' AND
           some_value = 'php' AND 
           user_id IN (
               SELECT user_id FROM some_table 
               WHERE 
                   some_key = 'skill' AND
                   some_value = 'js' -- AND user_id IN ... for next level, etc.
           )
    );

...想法是您可以“管道”内部选择。对于每个新属性,您都可以将新的内部选择添加到最内部的属性中。

于 2012-04-17T15:31:48.480 回答
1

您需要使用嵌套查询(或自连接,这是不同的)

我设置了下表。

+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| type  | char(10) | YES  |     | NULL    |       |
| value | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+

插入以下值

+------+-------+-------+
| id   | type  | value |
+------+-------+-------+
|    1 | skill | html  |
|    1 | skill | php   |
|    2 | skill | html  |
|    3 | skill | php   |
|    2 | skill | php   |
+------+-------+-------+

运行此查询

select id 
from test 
where type = 'skill' 
and value = 'html' 
and id in (
select id 
from test 
where type = 'skill' 
and value = 'php');

并得到

+------+
| id   |
+------+
|    1 |
|    2 |
+------+

自加入如下

select e1.id
from test e1, test e2
where e1.id = e2.id
and e2.type = 'skill'
and e2.value = 'html'
and e1.type = 'skill'
and e1.value = 'php'
;

并产生相同的结果。

所以你有两种方法可以在你的代码中尝试它。

于 2012-04-17T16:05:14.137 回答