2016-08-01 66 views
0

我有這個查詢,當我添加一個OR,返回多個行,我該如何解決這個問題?我需要另一個左連接或右連接?在選擇與多個行或

SELECT `images`.`id` as `id_image`, `images_lang`.`title` as `title`, `images_lang`.`autor` as `author`, `media_lang`.`file`, `category_lang`.`title` as `category` 
FROM `images` 
JOIN `images_lang` ON `images_lang`.`id_images` = `images`.`id` 
JOIN `category_lang` ON `images`.`id_category` = `category_lang`.`id_category` 
JOIN `media` ON `images`.`id` = `media`.`id_item` 
JOIN `media_lang` ON `media`.`id` = `media_lang`.`id_media` 
JOIN `relation` ON `relation`.`from_id` = `images`.`id` 
JOIN `tag` ON `tag`.`id` = `relation`.`to_id` 
JOIN `tag_lang` ON `tag`.`id` = `tag_lang`.`id_lang` 
WHERE `media`.`table` = 'images' 
AND `media_lang`.`id_lang` = '1' 
AND `images_lang`.`id_lang` = '1' 
AND `category_lang`.`id_lang` = '1' 
AND `images`.`active` = 1 
AND `relation`.`type` = 2 
AND `tag_lang`.`id_lang` = '1' 
AND `tag_lang`.`slug` = 'pa-am-oli' 
OR `tag_lang`.`slug` = 'playa' 
LIMIT 9 

和笨的代碼,但我不如何添加或之後與($關鍵字是過濾數組中的元素)

$this->db->select('images.id as id_image, images_lang.title as title, images_lang.autor as author, media_lang.file, category_lang.title as category'); 
     $this->db->from($this->table); 
     $this->db->join($this->table.'_lang',$this->table.'_lang.id_images = '.$this->table.'.id'); 
     $this->db->join('category_lang',$this->table.'.id_category = category_lang.id_category'); 
     $this->db->join('media',$this->table.'.id = media.id_item'); 
     $this->db->join('media_lang','media.id = media_lang.id_media'); 
     $this->db->where('media.table',$this->table); 
     $this->db->where('media_lang.id_lang',$id_lang); 
     $this->db->where($this->table.'_lang.id_lang', $id_lang); 
     $this->db->where('category_lang.id_lang', $id_lang); 
     $this->db->where('images.active', 1); 

     if($category){ 
      $this->db->where('category_lang.title', $category); 
     } 

     if($keywords){ 
      $this->db->join('relation', 'relation.from_id = '.$this->table.'.id'); 
      $this->db->join('tag', 'tag.id = relation.to_id'); 
      $this->db->join('tag_lang', 'tag.id = tag_lang.id_lang'); 
      $this->db->where('relation.type', _IMAGES_2_TAGS_); 
      $this->db->where('tag_lang.id_lang', $id_lang); 
      foreach($keywords as $tag){ 

       $this->db->or_where('tag_lang.slug', $tag); 

      } 

     } 

     if($from || $limit) 
     { 
      $this->db->limit((int)$limit, (int)$from); 
     } 

     $query = $this->db->get(); 

     return $query->result_array(); 

回答

0

我沒有得到你想要的到底需要,但如果你想使用OR

你的情況,過濾只有一個線作爲回報,你應該做到以下幾點:

WHERE (`media`.`table` = 'images' OR `tag_lang`.`slug` = 'playa') 
AND (`media_lang`.`id_lang` = '1' OR `tag_lang`.`slug` = 'playa') 

等等,希望能幫到你,祝你好運!

0

我解決了查詢加入這個(和SELECT DISTINCT)

AND (`tag_lang`.`slug` = 'playa' 
OR `tag_lang`.`slug` = 'pa-am-oli') 

我怎麼能在笨添加此?

0

精明使用括號將解決你的問題,但是這是更容易閱讀...

SELECT i.id id_image 
    , il.title 
    , il.autor author 
    , ml.file 
    , cl.title category 
    FROM images i 
    JOIN images_lang il 
    ON il.id_images = i.id 
    JOIN category_lang cl 
    ON cl.id_category = i.id_category 
    JOIN media m 
    ON m.id_item = i.id 
    JOIN media_lang ml 
    ON ml.id_media = m.id 
    JOIN relation r 
    ON r.from_id = i.id 
    JOIN tag t 
    ON t.id = r.to_id 
    JOIN tag_lang tl 
    ON tl.id_lang = t.id 
WHERE m.table = 'images' 
    AND ml.id_lang = 1 
    AND il.id_lang = 1 
    AND cl.id_lang = 1 
    AND i.active = 1 
    AND r.type = 2 
    AND tl.id_lang = 1 
    AND tl.slug IN('pa-am-oli','playa') 
LIMIT 9 

...但是,請注意,LIMIT沒有ORDER BY是沒有意義的。

+0

如果更改條件(例如,僅「cesta」),但不是真實的,圖像不具有這些標記,則始終返回相同的圖像。用這種方法和我試過的其他方法。 – NARTONIC

+0

對不起。我不明白這一點。 – Strawberry

+0

我有此(實施例) ID名稱標籤 1表格中的PA-AM-OLI 2 B CESTA 圖3C灘 但是,選擇總是返回第一行 – NARTONIC