0

我有一个包含以下字段和示例数据的表:

user_id     meta_key           meta_value
-------     --------           ----------
'69'        'usertemplate'     'template1'
'69'        'userstartdate'    '07/26/2012 02:01:37 PM'
'69'        'userenddate'      '07/26/2013 02:01:37 PM'
'70'        'usertemplate'     'template1'
'70'        'userstartdate'    '07/26/2013 02:01:37 PM'
'70'        'userenddate'      '07/26/2014 02:01:37 PM'
'71'        'usertemplate'     'template2'
'71'        'userstartdate'    '07/26/2012 02:01:37 PM'
'71'        'userenddate'      '07/26/2013 02:01:37 PM'
'72'        'usertemplate'     'template2'
'72'        'userstartdate'    '07/26/2011 02:01:37 PM'
'72'        'userenddate'      '07/26/2012 02:01:37 PM'
'73'        'usertemplate'     'template2'
'73'        'userstartdate'    '07/25/2011 02:01:37 PM'
'73'        'userenddate'      '07/25/2012 02:01:37 PM'

我的目标是获取 **user_id**s 列表(例如):

用户模板 = 模板 2

用户开始日期 > 07/20/2011 02:01:37 PM

用户开始日期 < 07/30/2011 02:01:37 PM

我将如何编写此查询?

编辑:这是我迄今为止尝试过的:

SELECT user_id 
FROM myTable t 
  INNER JOIN myTable s 
    ON t.user_id = s.user_id 
      AND s.meta_key = 'userstartdate' 
      AND CAST(s.meta_value AS DATE) > '07/20/2011 02:01:37 PM' 
  INNER JOIN myTable e 
    ON t.user_id = e.user_id 
      AND e.meta_key = 'userenddate' 
      AND CAST(e.meta_value AS DATE) < '07/30/2011 02:01:37 PM' 
WHERE t.meta_key = 'usertemplate' 
  AND t.meta_value = 'template2'
4

2 回答 2

1

您可以通过几个自联接来做到这一点:

SELECT user_id
FROM myTable t
INNER JOIN myTable s ON t.user_id = s.user_id 
    AND s.meta_key = 'userstartdate' 
    AND CAST(s.meta_value AS DATE) > '07/20/2011 02:01:37 PM'
INNER JOIN myTable e ON t.user_id = e.user_id 
    AND e.meta_key = 'userenddate' 
    AND CAST(e.meta_value AS DATE) < '07/30/2011 02:01:37 PM'
WHERE t.meta_key = 'usertemplate' AND t.meta_value = 'template2'

我将把转换为日期数据类型和比较的确切语法作为练习。:)

于 2013-03-13T19:53:53.857 回答
0

这应该有效:

SELECT DISTINCT T.user_id
 FROM tbl T
 INNER JOIN tbl T1
         on T.user_id = T1.user_id 
         AND T1.meta_key = 'usertemplate'
         AND T1.meta_value = 'template2'
 INNER JOIN tbl T2
         on T.user_id = T2.user_id 
         AND T2.meta_key = 'userstartdate'
         AND T2.meta_value > '07/20/2011 02:01:37 PM'   
         AND T2.meta_value < '07/30/2011 02:01:37 PM'
于 2013-03-13T19:55:12.920 回答