2014-10-02 30 views
0

我有以下MySQL表,并想在当天的谎言start_datemeta_valueend_date(格式为mmdd)之间只检索post_id的两行的值。截至今天(10月10日),只有post_id 11将被退回。 如何才能对属于同一个post_id的两行(开始日期和结束日期)进行比较?mysql的比较是属于同一个ID

请帮我一把!

╔═════════╦═══════════════╦════════════╗ 
║ post_id ║ meta_key ║ meta_value ║ 
╠═════════╬═══════════════╬════════════╣ 
║ 10  ║ start_date ║ 0101  ║ 
║ 10  ║ end_date  ║ 1231  ║ 
║ ...  ║ ...   ║ ...  ║ 
║ ...  ║ ...   ║ ...  ║ 
║ 11  ║ start_date ║ 0101  ║ 
║ 11  ║ end_date  ║ 0131  ║ 
║ ...  ║ ...   ║ ...  ║ 
║ ...  ║ ...   ║ ...  ║ 
╚═════════╩═══════════════╩════════════╝ 
+1

为什么不是start_date_date? – Strawberry 2014-10-02 13:05:16

+0

对不起,我的错 – user3200582 2014-10-02 13:13:47

+0

只是一个简单的建议,但保持主键**独特**更好。另外,请尝试** subquerying **。 – Gokigooooks 2014-10-02 13:16:30

回答

2

使用JOIN查询:

SELECT t1.post_id 
    FROM table_name t1 
    JOIN table_name t2 ON t2.post_id = t1.post_id 
WHERE t1.meta_key = 'start_date' 
    AND t2.meta_key = 'end_date' 
    AND DATE_FORMAT(NOW(), '%m%d') BETWEEN t1.meta_value AND t2.meta_value 

为什么JOIN - 因为我们需要比较表中两个不同行的值(一个是meta_key = 'start_date'和其他meta_key = 'end_date')。

+0

这应该是一个LEFT JOIN - 允许未定义的结束日期 – Strawberry 2014-10-02 13:13:10

+0

没有未定义的结束日期。日期代表产品的季节性可用性,因此不存在年份。 – user3200582 2014-10-02 13:21:15

+0

Rimas,这太棒了! thx这么多,为该解决方案的ur支持 – user3200582 2014-10-02 13:35:33

0

这是相当简单的,如果我理解你的要求(将与实际数据更容易) -

SELECT `post_id` 
FROM `table` 
WHERE `meta_value` BETWEEN 'start_date' AND 'end_date' -- supply actual dates here 
+1

我仍然认为你已经简化了这个问题 - 但让我们看看OP说的是什么。 – Strawberry 2014-10-02 13:09:26

+0

thx,但这是实际的数据。 meta_value列中提供了实际的start_date和end_date。所以我想你的解决方案将无法正常工作。 – user3200582 2014-10-02 13:17:52

+0

列meta_value @ user3200582的数据类型是什么? – 2014-10-02 13:18:56

0
DROP TABLE IF EXISTS eav_hell; 

CREATE TABLE eav_hell 
(post_id INT NOT NULL 
,meta_key VARCHAR(30) NOT NULL 
,meta_value DATE NOT NULL 
); 

INSERT INTO eav_hell VALUES 
(10  ,'start_date',20140101), 
(10  ,'end_date',20141231), 
(11  ,'start_date',20140101), 
(11  ,'end_date',20140131); 

SELECT x.post_id 
    , MAX(CASE WHEN meta_key = 'start_date' THEN meta_value END) start_date 
    , MAX(CASE WHEN meta_key = 'end_date' THEN meta_value END) end_date 
    FROM eav_hell x 
GROUP 
    BY post_id 
HAVING STR_TO_DATE('20140201','%Y%m%d') BETWEEN start_date AND end_date; 

+---------+------------+------------+ 
| post_id | start_date | end_date | 
+---------+------------+------------+ 
|  10 | 2014-01-01 | 2014-12-31 | 
+---------+------------+------------+ 

http://www.sqlfiddle.com/#!2/b38347/2 
+0

thx。就速度而言,你认为Rimas的解决方案有什么优势吗? – user3200582 2014-10-02 13:42:22

+0

如果有的话,Rimas的解决方案应该快一些!我只是觉得这个看起来有点干净。 – Strawberry 2014-10-02 13:44:28

+0

thx为你的答案,想推它,但只能给一个解决方案复选标记 – user3200582 2014-10-02 15:04:34