1

我有三个我想要的表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小时,它们的值都可以在-1和之间40。当设置为一个时,-1它应该被忽略并且不被使用。

一个节点可以同时填充field_min_hours_valuefield_max_hours_value值,然后表明它可以在field_min_hours_valuefield_max_hours_value小时之间变化。

如果field_min_hours_value设置了 only,那么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
4

3 回答 3

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
)
于 2013-07-26T13:20:57.133 回答
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.
于 2013-07-26T13:43:52.073 回答
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 编码 :)

于 2013-07-26T13:45:04.060 回答