2013-07-26 2 views
1

나는 INNER JOIN으로 3 개의 테이블을 가지므로 조건으로 일부 사용자 입력도 있습니다. 표는 다음과 같이 (간체)됩니다 무엇보다도 @max@min 시간을 먼저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 

내가 몇 사용자 입력 값으로 노드를 가져올 필요가 있고, 이들은 모두 -140 사이의 값을 가질 수 있습니다. 하나를 -1으로 설정하면이 값을 무시하고 사용해야합니다.

노드는 field_min_hours_valuefield_max_hours_value 값을 모두 채울 수 있으며 field_min_hours_valuefield_max_hours_value 시간 사이에 달라질 수 있음을 나타냅니다.

field_min_hours_value 만 설정되어있는 경우 은 0을 포함하며이 노드는 하나의 가능한 기간 만 가질 수 있음을 나타냅니다.

나는 underneith라는 쿼리와 같은 것을 시도했지만 에러를 만들어 냈지만, 내가해야 할 일을 다소 설명해 준다고 생각한다. @min@max 사이의 모든 노드를 가져오고 싶지만 이러한 값 중 하나 또는 둘 모두가 비어있을 수 있으므로 (모든 노드가 필요함) 고려해야합니다. 에서

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

감사합니다. 슬프게도 한 시간 전에 거의 같은 형식으로 시도했습니다. 당신의 예제를 보았을 때, 나는'= '대신에 "-1 condition"을 위해'! ='를 사용하여 그것을 한 것으로 나타났습니다. 고마워, 나는 당신이 작성한대로이 axactly 사용하고 또한 전화 주셔서 감사합니다. 이제 주말을위한 시간입니다 ...;) 다시 한번 감사드립니다! – 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 코딩 :