Php 一直在使用MySQL
我总是使用WHERE子句而不是have,但在这种情况下,我使用的是alias。。使用which is HAVING子句代替WHERE 这是我的问题Php 一直在使用MySQL,php,mysql,Php,Mysql,我总是使用WHERE子句而不是have,但在这种情况下,我使用的是alias。。使用which is HAVING子句代替WHERE 这是我的问题 Select ID, post_date, post_date_gmt, post_content, post_title, post_status, post_name, post_type, max(case when met
Select
ID,
post_date,
post_date_gmt,
post_content,
post_title,
post_status,
post_name,
post_type,
max(case when meta_key = 'ctg' then meta_value end) as category,
max(case when meta_key = 'qlty' then meta_value end) as quality
from
get_movies
where
post_status = 'publish'
and post_type = 'movies'
and meta_key in ('ctg','qlty')
and post_title like '%a%'
OR *CATEGORY LIKE '%a%'*
group by
ID,
post_date,
post_date_gmt,
post_content,
post_title,
post_status,
post_name,
post_type
order by
ID desc
我需要可以在字段别名处作为类别进行搜索像“%a%”这样的类别这是我想要的吗
答案中的附加信息
@斯坦尼斯洛瓦斯·卡拉什尼科瓦斯
[Err]1054-where子句中的未知列“category”
如果你从未见过wordpress表格,这里就是表格
post_id | post_title | meta_key | meta_value
19 | Example Title1 | ctg | Horror
19 | Example Title1 | qlty | HD
20 | Example Title2 | ctg | Action
20 | Example Title2 | qlty | HD
如果我使用我的查询(使用别名),这里是结果表
post_id | post_title | category(created from alias meta_key) | quality
19 | Example Title1 | Horror | HD
在这种情况下,我需要查询字段类别,它是从meta_key创建的…您不能在where中使用别名列名,但必须显式包含相同的引用上下文
where ... (other criteria) ...
OR ( meta_key = 'ctg' AND meta_value like '%a%' )
因此,对于所有其他不属于qualfier类别的元数据值,它会忽略,但当它命中时,也会应用类似的值 您不能将WHERE子句应用于别名列,但我建议您的问题更多地在于数据结构 看起来你有点疯狂,你复制了一大堆信息(你所有的
groupby
列),只是为了允许一个灵活的元列
为什么不将元数据内容分离到一个单独的表中,其中包含列post\u id
,key
,value
然后可以运行以下查询:
SELECT p.ID,
p.post_date,
p.post_date_gmt,
p.post_content,
p.post_title,
p.post_status,
p.post_name,
p.post_type,
pc.value as category,
pq.value as quality
FROM get_movies p
LEFT JOIN post_meta pc /* Category Join */
ON pc.post_id = p.ID
AND pc.key = 'ctg'
LEFT JOIN post_meta pq /* Quality Join */
ON pq.post_id = p.ID
AND pq.key = 'qlty'
WHERE p.post_status = 'publish'
AND p.post_type = 'movies'
AND (p.post_title LIKE '%a%' OR pc.value LIKE '%a%')
ORDER BY p.ID desc
我总是使用WHERE
子句,而不是have
其中
和具有的不可互换。它们在不同的层面上运作其中
过滤行,具有条件的应用于为组计算的聚合值
其中
无法评估涉及类别
别名的条件,因为它对分组后计算的值使用别名。WHERE
子句在分组之前进行计算
类似“%a%”的类别
条件必须保留在HAVING
子句中(在groupby
之后)
您的WHERE
子句是错误的。后两个条件(由或连接的条件)应放在括号内,因为和的优先级高于或
。现在,查询选择与类别匹配的所有行,而不管其他字段的值(post\u status
,post\u type
等)
由于或
的原因,您需要在HAVING
子句中移动这两个条件:
SELECT
ID,
post_date,
post_date_gmt,
post_content,
post_title,
post_status,
post_name,
post_type,
max(case when meta_key = 'ctg' then meta_value end) as category,
max(case when meta_key = 'qlty' then meta_value end) as quality
FROM
get_movies
WHERE
post_status = 'publish'
and post_type = 'movies'
and meta_key in ('ctg','qlty')
GROUP BY
ID,
post_date,
post_date_gmt,
post_content,
post_title,
post_status,
post_name,
post_type
HAVING
post_title like '%a%'
or category like '%a%'
ORDER BY
ID desc
有关的详细信息及其执行方式,请阅读。我觉得您的查询很好。你有什么问题?你想使用HAVING子句吗?“我总是使用WHERE
子句而不是HAVING
”--WHERE
和HAVING
是不可互换的。它们在不同的层面上运作其中
过滤行,具有
条件的
应用于为组计算的聚合值。该查询没有任何意义。按ID
分组有什么意义?您是否有多个条目具有给定的ID
?你是说从表和表中连接?wp_邮政和wp_邮政?我已经为此创建了视图。。这就是为什么我们称之为“get_movies”@Edofx好吧,我可能会在问题中包含这些信息,并将其标记为wordpress。。听起来您的视图get_movies
如果返回重复的元组,则需要重构。我先从基表开始,然后再从基表开始,您可以在以后添加视图。您可以在HAVING子句n MySQL中使用SELECT别名,但不能使用WHERE子句。@亚瑟,您是对的,我只是很少使用HAVING子句。这是有意义的,因为结果已经计算、聚合等,并且在保留/丢弃之前可以使用适当的列进行比较。谢谢并从答案中删除。我希望它能起作用。你可以想象我无法测试它。@Edofx。。不,这不是您需要的,您应该从基表开始工作,然后重构get\u movies
视图。这行得通,但这是你为自己制造的问题的一个补丁。我完全同意@arth@axiac,它确实回答了眼前的问题,并且包含了一些关于WHERE和HAVING子句的好信息,不过我给你加1。