我有三个表我想要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_value
和field_max_hours_value
值,然后表示它可以在field_min_hours_value
和field_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
答案 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编码:)