在MySQL使用HAVING

时间:2017-08-23 09:18:50

标签: php mysql

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

创建的

3 个答案:

答案 0 :(得分:2)

  

我一直使用WHERE子句代替HAVING

WHEREHAVING不可互换。它们在不同层面上运作。 WHERE过滤行,HAVING条件适用于为组计算的汇总值。

WHERE无法评估涉及category别名的条件,因为它会对分组后计算的值进行别名。在分组之前评估WHERE子句。

CATEGORY LIKE '%a%'条件必须保留在HAVING子句中(GROUP BY之后)。

您的WHERE子句错误。最后两个条件(由OR加入的条件)应放在括号内,因为AND的优先级高于OR {1}}。就像现在一样,查询会选择与该类别匹配的所有行,无论其他字段(post_statuspost_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_idkeyvalue

然后您可以运行以下查询:

   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