MySQL查询子查询或分组

MySQL查询子查询或分组,mysql,subquery,Mysql,Subquery,每个modx_site_内容记录在modx_site_tmplvar_contentvalues中可能有多个记录 我需要检索modx_site_tmplvar_contentvalues.value,其中tvv.tmplvarid=3和tvv.tmplvarid=1。如果tvv.tmplvarid是未来的日期,我需要返回tvv.tmplvarid 3的tvv.value,这是一个逗号分隔的标记列表 这个查询没有返回我需要的值&我不知道如何得到我想要的 SELECT sc.id, sc.paget

每个modx_site_内容记录在modx_site_tmplvar_contentvalues中可能有多个记录

我需要检索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表中的任何内容。

我找到了。如果你只是阅读文档,你会做什么


我想出来了。如果你只是阅读文档,你会做什么


因此,您需要返回
modx\u site\u tmplvar\u contentvalues
表中的两行标记,该表的
tmplvarid
值为1和3,这两行都与相同的
modx\u site\u内容相关,但只有在
tmplvarid
3行将来有一个datetime字段时才需要返回标记

我将对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 FIDLE:

因此您需要返回
modx\u site\u tmplvar\u contentvalues
表中的两行标记,该表的
tmplvarid
为1和3,这两行都与相同的
modx\u site\u内容相关,但仅当
tmplvarid
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 FIDLE:

我会使用两个连接,而不是一个子选择-应该更快。我在回答中举了一个例子。我会使用两个连接而不是一个子选择-应该更快。我在回答中举了一个例子。我知道你要说的是什么,但它也会返回“现在”之前的值。SQL查询稍有错误(刚刚更新了SQL fiddle),它有一行过去的日期无法返回。如果在tThree.value之后添加as date,或者将和tThree.date更改为tThree.value,则可以这样做。你的速度快了0.003s(至少在我的测试中是这样),所以干杯,两种方法都有效,但你的效率更高。不知为什么,我不得不等一天才能给你奖金。。。。但愿我记得;)啊,太好了——很高兴它起作用了。呵呵,0.003秒——不是很大的进步,但总比什么都没有强!在进行基准测试时,您是否将
SQL\u NO\u缓存
放在
SELECT
关键字之后?否则,查询缓存将启动,并且不会给您(可能)不切实际的计时,具体取决于您的服务器查询配置文件。我明白你的意思了,但它也会返回“now”之前的值。SQL查询有点错误(刚刚更新了SQL FIDLE),它有一行过去的日期没有返回。如果在tThree.value之后添加as date,或者将和tThree.date更改为tThree.value,这就行了。你的速度快了0.003s(至少在我的测试中是这样),所以干杯,两种方法都有效,但你的效率更高。不知为什么,我不得不等一天才能给你奖金。。。。但愿我记得;)啊,太好了——很高兴它起作用了。呵呵,0.003秒——不是很大的进步,但总比什么都没有强!在进行基准测试时,您是否将
SQL\u NO\u缓存
放在
SELECT
关键字之后?否则,查询缓存将启动,并且不会给您(可能)不切实际的计时,具体取决于您的服务器查询配置文件。