使用CodeIgniter活动记录:
$country = $_SESSION['search'];
$min_price = $_SESSION['min_price'];
$max_price = $_SESSION['max_price'];
$condition = "";
$this->db->select('*,attachments.title as image');
$this->db->from('details');
$this->db->join('attachments', 'attachments.parent = details.id');
$this->db->where('attachments.type', 'quotes');
if ($country != '')
{
$condition .= "(details.service_location IN ('" . $country . "') OR details.country in ('" . $country . "'))";
$this->db->where($condition);
}
$this->db->where('details.price_range_from >=', $min_price);
$this->db->where('details.price_range_to <=', $max_price);
$this->db->group_by("attachments.parent");
$this->db->order_by("details.created_on", "asc");
$query = $this->db->get();
$result = $query->result();
return $result;
}
我有两张桌子说详细信息和附件,我想加入他们。
表格详细信息将始终包含记录。
当表附件中包含行时,我希望查询转换表详细信息和表附件匹配的所有行。 (即表现得像内部联接)
但是,如果表格附件为空,我想从表格详细信息中返回所有内容。
并检查where条件中的表附件。
这可以在1个查询中完成吗?
感谢。
答案 0 :(得分:3)
使用LEFT OUTER JOIN而不是JOIN
FROM (details)
LEFT OUTER JOIN attachments ON attachments.parent = details.restaurant_id
更新
当然
GROUP BY details.restaurant_id
而不是attachments.parent
答案 1 :(得分:0)
虽然我认为这有点奇怪,但你可以使用的主要结构是:
inner join
union
select *, ... from details where 0 = (select count(*) from attachments where ...)
如果内部联接不返回行,则第二个查询将返回所有详细信息。 如果内部联接返回行,则第二个查询将不返回任何内容,因为找到了附件(count(*)返回一些正值)。
我认为您可以自己填写详细信息。 我不保证表现出色。
答案 2 :(得分:0)
使用两个不同的查询,检查附件是否有行并使用内部联接详细信息运行查询,否则从详细信息表返回行
IF EXISTS (SELECT * FROM @attachments where column1='')
BEGIN
SELECT * FROM attachments as atc
INNER JOIN details AS det ON atc.parent = det.restaurant_id where column2=''
END
ELSE
SELECT * FROM details where column2=''