2012-10-30 135 views
1

每个modx_site_content记录可能在modx_site_tmplvar_contentvalues中有多个记录。MySQL查询子查询或分组

我需要检索两个modx_site_tmplvar_contentvalues.value其中tvv.tmplvarid = 3,tvv.tmplvarid = 1,其中tvv.tmplvarid是未来的日子,我需要返回tvv.tmplvarid 3 tvv.value这是逗号分隔的标签列表。

此查询不返回我需要的值&我不知道如何得到我想要的。

SELECT sc.id, sc.pagetitle, tvv.value, tvv.tmplvarid, tvv.id, tvv.value 
FROM modx_site_content sc 
left join modx_site_tmplvar_contentvalues tvv on tvv.contentid = sc.id 
where published = '1' 
and (tvv.tmplvarid = '3' and tvv.value >= curdate()) 
order by sc.id; 

基本上在最后,我只需要返回的标记列表(tvv.tmplvarid = 3)在其他相关记录(tvv.tmplvarid = 1)是将来的日期。

任何想法,这可以用分组来完成吗?我实际上并不需要modx_site_content表中的任何内容。

回答

1

所以你需要返回两行的标签有1 tmplvarid和3都与同一modx_site_contentmodx_site_tmplvar_contentvalues表,但只有当3行有未来的日期时间字段?

我会做两个独立的连接到modx_site_tmplvar_contentvalues田部:

SELECT tOne.value, tThree.value 
FROM modx_site_tmplvar_contentvalues tOne 
INNER JOIN modx_site_content c ON tOne.contentid = c.id 
INNER JOIN modx_site_tmplvar_contentvalues tThree ON tThree.contentid = c.id 
WHERE c.published = 1 
AND tOne.tmplvarid = 1 
AND tThree.tmplvarid = 3 AND tThree.date > NOW() 

SQL小提琴:http://sqlfiddle.com/#!2/a4031/2

+0

我明白你要去哪里,但它会返回'now'之前的值。 –

+0

SQL查询有点不对(只是更新了sql小提琴),它有一个过去的日期不返回的行。 – theon

+0

如果在tThree.value之后添加AS日期或将AND tThree.date更改为tThree.value,则可以工作。你的速度快了0.003秒[至少在我的测试中],所以欢呼,两者都有效,但你的效率更高。 –

0

我想通了。惊人的,你可以做什么,如果你刚才读的文档;)

select tv.contentid, tv.value as eventdate, sc.id, sc.pagetitle, tvv.value from 
( 
select * from modx_site_tmplvar_contentvalues cv 
where cv.tmplvarid = 3 
and cv.value >= curdate() 
) as tv 
left join modx_site_content sc on sc.id = tv.contentid 
left join modx_site_tmplvar_contentvalues tvv on tvv.contentid = sc.id 
where (tvv.tmplvarid = 1) 
order by value asc 
+0

我会使用两个连接,而不是一个子选择 - 应该会更快。我在我的答案中列举了一个例子。 – theon