SQL - 连接2个表,但如果1个表为空则返回所有表

时间:2014-05-15 05:53:27

标签: php mysql sql codeigniter join

使用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个查询中完成吗?

感谢。

3 个答案:

答案 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=''