[英]sql query with multiple where statements
我有一個相當的,對我來說,復雜的mysql查詢,我完全陷入困境,無法找到任何在線答案。
這是我的查詢:
SELECT
items.*
FROM
items
INNER JOIN
items_meta_data
WHERE
(
(meta_key = 'lat' AND meta_value >= '55')
OR
(meta_key = 'lat' AND meta_value <= '65')
)
AND
(
(meta_key = 'long' AND meta_value >= '20')
OR
(meta_key = 'long' AND meta_value <= '30')
)
GROUP BY
item_id
當然,我只用1個語句測試了查詢,並且工作正常。 因此,如果我只傳遞長或緯度部分,那么我得到結果。 只有當我嘗試將它們拼接在一起時才會得到不同的結果。
我在這里先向您的幫助表示感謝!
表結構如下:
表項:ID item_name item_description
表meta:meta_id item_id meta_key meta_value
解
對於任何有興趣的人,我終於設法解決了這個問題。 謝謝大家的幫助和內心。
SELECT
SQL_CALC_FOUND_ROWS items.*
FROM
items
INNER JOIN
items_meta ON (items.ID = items_meta.post_id)
INNER JOIN
items_meta AS m1 ON (items.ID = m1.post_id)
WHERE
1=1
AND
items.post_type = 'post'
AND
(items.post_status = 'publish')
AND
( (items_meta.meta_key = 'lat' AND CAST(items_meta.meta_value AS SIGNED) BETWEEN '55' AND '65')
AND
(m1.meta_key = 'long' AND CAST(m1.meta_value AS SIGNED) BETWEEN '20' AND '30') )
GROUP BY
items.ID
ORDER BY
items.date
DESC
您需要考慮在評估WHERE
子句條件后發生GROUP BY
。 並且WHERE
子句始終只考慮一行,這意味着在您的查詢中, meta_key
條件將始終阻止選擇任何記錄,因為一列不能有一行的多個值 。
那么多余的meta_value檢查呢? 如果允許值既小又大於給定值,那么它的實際值根本不重要 - 可以省略檢查。
根據您的一條評論,您要檢查距離指定位置不到一定距離的地方。 要獲得正確的距離,您實際上必須使用某種適當的距離函數(有關詳細信息,請參閱此問題 )。 但是這個SQL應該會讓你知道如何開始:
SELECT items.* FROM items i, meta_data m1, meta_data m2
WHERE i.item_id = m1.item_id and i.item_id = m2.item_id
AND m1.meta_key = 'lat' AND m1.meta_value >= 55 AND m1.meta_value <= 65
AND m2.meta_key = 'lng' AND m2.meta_value >= 20 AND m2.meta_value <= 30
這個..
(
(meta_key = 'lat' AND meta_value >= '60.23457047672217')
OR
(meta_key = 'lat' AND meta_value <= '60.23457047672217')
)
是相同的
(
(meta_key = 'lat')
)
將它們全部加在一起(同樣適用於long
過濾器)你有這個不可能的WHERE子句,它不會給出任何行,因為meta_key
不能是一行中的2個值
WHERE
(meta_key = 'lat' AND meta_key = 'long' )
您需要檢查您的操作員以確保您獲得正確的邏輯
什么是meta_key
? 刪除所有meta_value
條件,減少,最后你得到:
SELECT
*
FROM
meta_data
WHERE
(
(meta_key = 'lat')
)
AND
(
(meta_key = 'long')
)
GROUP BY
item_id
由於meta_key
永遠不能同時等於兩個不同的值,因此不會返回任何結果。
根據這個問題和答案到目前為止的評論,聽起來你正在尋找更多的東西:
SELECT
*
FROM
meta_data
WHERE
(
(meta_key = 'lat')
AND
(
(meta_value >= '60.23457047672217')
OR
(meta_value <= '60.23457047672217')
)
)
OR
(
(meta_key = 'long')
AND
(
(meta_value >= '24.879140853881836')
OR
(meta_value <= '24.879140853881836')
)
)
GROUP BY
item_id
注意頂級條件之間的OR
。 這是因為你想要lat
或 long
記錄,因為沒有單個記錄是lat
和 long
。
我仍然不確定你要通過內部條件完成什么。 任何非空值都將匹配這些數字。 所以也許你可以詳細說明你想在那里做什么。 我也不確定GROUP BY
子句的用途,但這可能完全超出了這個問題的上下文。
我們能看到你桌子的結構嗎? 如果我理解這一點,那么查詢的假設是記錄只能是meta_key - 'lat'
或meta_key = 'long'
不是兩者都因為每行只有一個meta_key
列,並且只能包含1個相應的值,而不是這就解釋了為什么你用AND
連接時沒有得到結果; 不可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.