2017-08-23 71 views
3

HAVING我一直在使用的WHERE子句而不是,但在這種情況下,我使用的別名..這是HAVING子句代替WHERE ..使用停留在MySQL的

這裏我查詢

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 

我需要可以在字段別名搜索作爲類別.. 類別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 

if im using my查詢(使用別名),這裏的結果表

post_id | post_title  | category(created from alias meta_key)  | quality 
19  | Example Title1 | Horror         | HD 

在這種情況下,我需要爲字段類別,這是從meta_key創建的查詢......

+0

您的查詢對我來說很好。你有什麼問題?你想使用HAVING子句? –

+0

*「我總是使用'WHERE'子句而不是'HAVING'」* - 'WHERE'和'HAVING'不能互換。他們在不同的層面上運作。 'WHERE'過濾行,'HAVING'條件適用於爲組計算的聚合值。 – axiac

+0

該查詢沒有任何意義。 'ID'分組有什麼意義?你有給定的'ID'多個條目嗎? – axiac

回答

2

我總是用WHERE條款,而不是HAVING

WHEREHAVING不能互換:

然後你可以運行下面的查詢。他們在不同的層面上運作。 WHERE篩選行,HAVING條件適用於爲組計算的彙總值。

WHERE無法評估涉及category別名的條件,因爲它會對分組後計算的值進行別名。在分組之前評估WHERE子句。

CATEGORY LIKE '%a%'條件必須停留在HAVING條款(在GROUP BY之後)。

您的WHERE子句是錯誤的。最後兩個條件(由OR加入的條件)應置於括號內,因爲AND優先於OR。現在,查詢會選擇與該類別匹配的所有行,而不管其他字段的值(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以及它是如何執行的更多信息。

+0

這就是我需要的! ..哦謝謝@Axiac ..你保存我的一天.. – Edofx

+0

我希望它的作品。你可以想象我無法測試它。 – axiac

+1

@Edofx ..不,這不是你所需要的,你應該從基表開始工作,然後重構你的'get_movies'視圖。這會起作用,但它是您爲自己創建的問題的補丁。 – Arth

0

你不能在使用別名的列名在那裏,但必須明確地包括相同的情況下

where ... (other criteria) ... 
    OR (meta_key = 'ctg' AND meta_value like '%a%') 

所以,對於那些類別qualfier不是所有的其他元數據值,它忽略了,但是當它擊中,應用等,以及。

+0

您可以在HAVING子句中使用SELECT別名n MySQL,而不是WHERE子句。 – Arth

+0

@Arth,你是對的,我只是有很多次,我實際上使用了一個HAVING子句。它是有意義的,因爲結果已經被計算,彙總等等,並且在保持/丟棄之前可以用適當的列進行比較。謝謝並刪除從答案。 – DRapp

0

您不能將WHERE子句應用於別名列,但是我建議您的問題更多地與您的數據結構有關。

看起來你有一個瘋狂的設置,你在複製大量信息(所有你的GROUP BY列),只是爲了允許靈活的元列。

爲什麼不將meta元素分離出單獨的表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 
+0

'** LEFT JOIN post_meta pc/*類別加入*/*' post_meta?你是指從表和表加入? wp_posts和wp_postmeta?我已經爲此創建視圖..多數民衆贊成爲什麼叫'get_movies' – Edofx

+0

@Edofx那麼,我可能會在問題中包含該信息並將其標記爲wordpress ..聽起來像您的看法'get_movies'需要重構,如果它是返回重複元組。我會從基礎表開始,然後從那裏開始,隨後可以添加視圖。 – Arth