2011-07-26 155 views
2

考慮以下兩個表:這個mySQL查詢有什麼問題?

tag_names (tag_id, tag_name) 
tag_links (tag_id, image_id) 

的圖像可以有多個標籤,我想選擇一個特定的圖像ID的所有標籤。 我想下面的查詢,但它似乎沒有正確選擇(只選擇一行),它有什麼問題?

SELECT tag_name 
FROM tag_names 
LEFT JOIN tag_links.tag_id = tag_names.tag_id 
WHERE tag_links.image_id = $image_id 

編輯:我用笨的活動記錄查詢,但我基本的SQL格式寫的,這樣,如果有人不使用CodeIgniter fimiliar可以提供幫助。然而,這個查詢在簡單的mysql格式下工作正常(不使用CodeIgniter),但奇怪的是CodeIgniter不起作用,即使語法沒有任何問題,它只是選擇一行。

下面是CodeIgniter的語法:

$this->db->select('tag_name'); 
$this->db->from('tag_names'); 
$this->db->join('tag_links', 'tag_links.tag_id = tag_names.tag_id', 'left'); 
$this -> db -> where('tag_links.image_id', (int)$image_id);  
$query = $this->db->get(); 
+0

我認爲tag_links必須與tag_names保持連接,而不是tag_names與tag_links。 –

+0

編輯我的答案。 – avall

回答

2

試試這個:

SELECT tag_name 
FROM tag_names 
LEFT JOIN tag_links 
ON tag_links.tag_id = tag_names.tag_id 
WHERE tag_links.image_id = $image_id 

恕我直言,你忘了(與ON說法正確)加入表所使用。

編輯:我有兩個想法如何擺脫這個問題:

第一: 更改線路與SELECT

$this->db->select('tag_names.tag_name'); 

二: 使用select()與完整的查詢功能:

$this->db->select($query, false); 

$ T his-> db-> select()接受一個可選的第二個參數。如果您將 設置爲FALSE,則CodeIgniter將不會嘗試使用反引號來保護您的字段或表 名稱。如果您需要複合選擇 聲明,這很有用。

來自:http://codeigniter.com/user_guide/database/active_record.html#select

+0

謝謝,對不起,我忘了在這裏,但它不是問題。正如我編輯我的帖子,並提到這個查詢工作正常與簡單的MySQL語法,但即時通訊嘗試與CodeIgniter活動記錄,這給出了奇怪的結果。 – Roman

+0

非常感謝您付出精力解決問題。然而,問題是由我的愚蠢造成的,我沒有注意到,在我的模型函數中,我返回了'$ query-> row();',而不是'$ query-> result();'這是因爲我有隻是從我的其他功能複製代碼。但感謝你的時間,我接受你的答案。 – Roman

1
SELECT tag_names.tag_name 
FROM tag_links 
LEFT JOIN tag_names.tag_id = tag_links.tag_id 
WHERE tag_links.image_id = $image_id 

tag_names只會有一個給定的ID,這意味着你的查詢將返回一個結果單個條目。您首先需要從tag_links中進行選擇,然後在其上加上標籤的名稱,以便正確地從包含多個條目的表中進行選擇。

2

看來你有一個語法錯誤(您忘記tag_links在JOIN子句)。順便說一下,我認爲你不需要LEFT JOIN爲此目的,否則你可能會得到不正確的結果。

SELECT tag_name 
FROM 
    tag_names 
    JOIN tag_links ON tag_links.tag_id = tag_names.tag_id 
WHERE tag_links.image_id = $image_id 
+0

由於WHERE語句不允許,因此得到不正確的結果是錯誤的。 – avall

+0

@avall理論上是。但這不是一個好的做法,依靠意外的黑客代碼:) – Karolis

+0

我同意。過了一段時間,代碼更難維護。 – avall