MySQL:条件WHERE块

时间:2013-07-26 13:16:19

标签: mysql

我有三个表我想要INNER JOIN,因此我也有一些用户输入作为条件。表(简化)如下:

# 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,并且它们组合起来表明此节点只有一个可能的持续时间。

我尝试了类似查询的内容,但是会产生错误,但我认为它确实说明了我需要做些什么。我想要获取@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

3 个答案:

答案 0 :(得分:2)

在WHERE中使用另一个OR条件:

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
)

答案 1 :(得分: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.

答案 2 :(得分: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>=@min or p.field_max_hours_value =0 and 
p.field_min_hours_value>=@min))and p.field_min_hours_value<@max    

源SQL编码:)