2011-07-26 4 views
2

は、次の2つのテーブル次の点を考慮このmySQLクエリで何が問題になっていますか?

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

画像を複数のタグを持つことができ、私は特定の画像IDのすべてのタグを選択します。 次のクエリを試行していますが、正しく選択されていないようです(1つの行のみを選択します)。何が問題なのですか?

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

編集:私はCodeIgniterのアクティブレコードクエリを使用している、誰かが助けることができるのCodeIgniterでfimiliarされていない場合ように、私は基本的なSQL形式で書きました。しかし、このクエリは、(CodeIgniterを使用せずに)単純なmysqlフォーマットではうまく動作しますが、CodeIgniterでは動作しません。構文に問題がなくても、ただ1つの行が選択されます。ここで

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を結合したままにする必要があります。 –

+0

私の答えを編集しました。 – avall

答えて

2

はこれを試してみてください。

編集:私はこの問題を取り除くためにどのように2つのアイデアを持っている

初:完全なクエリと 使用選択()関数:SELECT

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

セカンドで行を変更 :

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

$トンhis-> db-> select()は、オプションの第2パラメータを受け入れます。 をFALSEに設定すると、CodeIgniterはフィールドまたはテーブル の名前をバックティックで保護しようとしません。これは、化合物選択 ステートメントが必要な場合に便利です。

から:http://codeigniter.com/user_guide/database/active_record.html#select

+0

ありがとう、申し訳ありません、私はここに置くのを忘れましたが、それは問題ではありません。私は私の投稿を編集し、このクエリは単純なmysql構文でうまく動作すると述べていますが、奇妙な結果をもたらすCodeIgniterアクティブレコードで使用するようにしています。 – Roman

+0

本当にありがとうございました。しかし、問題は私の愚かさに起因していました。私のモデル関数では、 '$ query-> result();の代わりに' $ query-> row(); 'を返していたことに気づきませんでした。他の機能からコピーされたコードだけです。あなたのお時間をいただき、ありがとうございます。 – 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から選択し、その上にタグの名前を結合する必要があります。そのため、複数のエントリを持つ表から正しく選択することができます。あなたは(ON文で適切に)テーブルに参加するのを忘れIMHO、使用している

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 

2

あなたが(あなたがJOIN句でtag_linksを忘れてしまった)構文エラーを持っているようです。ちなみに私の意見では、この目的のために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

関連する問題