2013-07-26 65 views
1

我有三張表,我想要INNER JOIN,因此我也有一些用戶輸入的條件。這些表(簡化的)如下:MySQL:有條件的WHERE塊

# Table: node 
- nid 
- title 

#Table: field_min_hours_value 
- entity_id (corresponds to node.nid) 
- field_min_hours_value 

#Table: field_max_hours_value 
- entity_id (corresponds to node.nid) 
- field_max_hours_value 

我需要與幾個用戶輸入值來獲取的節點,首先@max@min小時,這些既可以具有-140之間的值。當其中一個設置爲-1時,應該忽略並且不能使用。

節點可以同時填充field_min_hours_valuefield_max_hours_value值,則表示它可以在field_min_hours_valuefield_max_hours_value小時之間變化。

如果只設置了field_min_hours_value,則field_max_hours_value將包含0,並且它們組合表示該節點只有一個可能的持續時間。

我想是這樣的查詢underneith,而造成的錯誤,但我認爲它確實說明了有些什麼,我需要做的。我想獲取@min@max之間的所有節點,但也想要考慮這些值中的一個或兩個都可以爲空(-1),然後我需要所有節點。

SELECT n.nid, n.title, min.field_min_hours_value, max.field_max_hours_value 
    FROM node n 
    INNER JOIN field_data_field_max_hours max 
    ON n.nid = max.entity_id 
    INNER JOIN field_data_field_min_hours min 
    ON n.nid = min.entity_id 
    # Use the min value 
    IF @min != -1 THEN 
    WHERE 
     max.field_max_hours_value >= @min 
     OR (max.field_max_hours_value = 0 AND min.field_min_hours_value >= @min) # Needed for when there is no max_hours set in the node 
    END IF 
    # Use the max value 
    IF @max != -1 THEN 
    AND 
     # Use the max value 
     (min.field_min_hours_value <= @max) 
    END IF 

回答

2

使用另一張OR條件在WHERE:

WHERE (@min = -1 OR 
    max.field_max_hours_value >= @min 
     OR (max.field_max_hours_value = 0 AND min.field_min_hours_value >= @min) 
     # Needed for when there is no max_hours set in the node  
) AND (@max = -1 OR 
    (min.field_min_hours_value <= @max) 
    # Use the max value 
) 
+0

謝謝了,很遺憾,我已經嘗試過這種方式,就像一個小時前一樣。看到你的例子,我注意到我是用'!='代替' - condition'代替'='來做的。謝謝,我用你寫的這個斧頭,也感謝你的叫醒。現在是週末的時間了......)再次感謝! – Ambidex

+0

是的,我會在週末節省一些'感謝':D – gaborsch

0

使用此SQL

select n.nid, n.title, min.field_min_hours_value, max.field_max_hours_value 
from node n 
    left outer join field_max_hours_value max on max.entity_id = n.nid 
    left outer join field_min_hours_value min on min.entity_id = n.nid 
    where (min.field_min_hours_value <= @min or -1 = @min) 
     and (max.field_max_hours_value >= @max or -1 = @max) 

使用

ifnull(min.field_min_hours_value, -1), ifnull(max.field_max_hours_value, -1) 
if you want to get null values as -1. 
0
select * from (SELECT n.nid, n.title, 
(case when field_min_hours_value is null then 0 
     when field_min_hours_value is not null then field_min_hours_value end) 
as field_min_hours_value, 
(case when max.field_max_hours_value is null then 0 
     when max.field_max_hours_value is not null then max.field_max_hours_value end) 
as max.field_max_hours_value 
FROM node n 
left join field_data_field_min_hours min ON n.nid = min.entity_id 
left join field_data_field_max_hours max ON n.nid = max.entity_id) as p 
where (p.field_max_hours_value>[email protected] or p.field_max_hours_value =0 and 
p.field_min_hours_value>[email protected]))and p.field_min_hours_value<@max  

源SQL編碼:)