Php 一直在使用MySQL

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

我总是使用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 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。