我总是使用WHERE子句而不是HAVING,但在这种情况下,我使用别名..这是使用HAVING CLAUSE而不是WHERE ..
这是我的查询
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
我需要在字段别名中搜索一个类别.. CATEGORY LIKE'%a%'这可能是我想要的吗?
ANSWER的其他信息
@StanislovasKalašnikovas
[错误] 1054 - 'where子句'中的未知列'类别'
如果你从未见过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 ...
创建的答案 0 :(得分:2)
我一直使用
WHERE
子句代替HAVING
WHERE
和HAVING
不可互换。它们在不同层面上运作。 WHERE
过滤行,HAVING
条件适用于为组计算的汇总值。
WHERE
无法评估涉及category
别名的条件,因为它会对分组后计算的值进行别名。在分组之前评估WHERE
子句。
CATEGORY LIKE '%a%'
条件必须保留在HAVING
子句中(GROUP BY
之后)。
您的WHERE
子句错误。最后两个条件(由OR
加入的条件)应放在括号内,因为AND
的优先级高于OR
{1}}。就像现在一样,查询会选择与该类别匹配的所有行,无论其他字段(post_status
,post_type
等)的值如何。
由于OR
您需要在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
阅读documentation,了解有关SELECT
statement及其执行方式的详情。
答案 1 :(得分:0)
您无法在where中使用别名列名,但必须明确包含相同的引用上下文
where ... (other criteria) ...
OR ( meta_key = 'ctg' AND meta_value like '%a%' )
因此,对于所有其他不属于类别qualfier的元数据值,它会忽略,但是当它被击中时,也会应用类似值。
答案 2 :(得分:0)
您不能将WHERE子句应用于别名列,但我建议您的问题更多地取决于您的数据结构。
看起来你有一个疯狂的设置,你复制了大量信息(所有GROUP BY
列)只是为了允许一个灵活的元列。
为什么不将元数据分隔到单独的表post_meta
中,列post_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