簡體   English   中英

帶有多個where語句的sql查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM