2016-04-12 13 views
0

私のデータベースmedoo.phpを扱うのに素晴らしいPHPフレームワークを使用しています。参照用medooドキュメントへのリンク:私は起こるしたいものhttp://medoo.in/docMysqlは両方のテーブルを結合しました。

  • 戻り、それは右の表から1つ以上の条件に合致する結合テーブルからすべてのレコード。 (メインテーブルは「アイテム」です)
  • 右側のテーブルの一致/結合レコードが含まれます。 (この場合に返される 'items'に関連するすべての 'タグ')。現在、何が起こっているのか

:左表(項目)から

  • 戻りレコードは右表(タグ)に参加しました。ただし、WHERE条件からタグを明示的に含むレコードのみを返します。 WHERE条件に一致するタグを持つ項目で、項目に結合されたすべてのタグが必要です。

はのは、いくつかのコードがよりよい問題を説明するために取得してみましょう:

基本的なセットアップを示して
//example 'items' table 
    id - 123 
    name - 'test' 
    desc - 'testing' 

//example 'tags' table 
    id - 100 
    name - 'tag1' 

//example 'taglist' table (relational) 
    id  - 10 
    itemid - 123 
    tagid - 100 

は、わかりやすくするためにビットを最小化。

その後、medooを使用して、私は「アイテム」からの選択だし、(現在は)左でのタグ/タグリストを連結する連結します。 WHERE句:tag.idは検索されたタグIDと一致します。また、WHEREの中でtaglist.tagidを試しました。返さ

結果は、あなたが期待するように、WHERE句に一致するタグを含むすべての「アイテム」です。しかし、私は検索したタグだけでなく、それらのアイテムに付随するすべてのタグを必要としています(これは私が得たものです)。

私は結合またはWHERE句が、私は私がしようと、研究と多くの試みの時間後に迷ってしまいましたと言わなければならないとは何かでなければならないと思っています。誰かが私のロジックに誤りを起こした可能性が高い箇所を見つけて、誰かが私に素早く手を差し伸べることができます。

さらに参照すると、ここではmedooを使用した完全なクエリの設定を示します。

//setup query 
$table = 'items'; 
$join = [ 
    "[>]taglist(tl)" => ["id" => "itemid"], 
    "[>]filelist(fl)" => ["id" => "itemid"], 
    "[>]tags(t)" => ["tl.tagid" => "id"], 
    "[>]files(f)" => ["fl.fileid" => "id"] 
]; 
$cols = [ 
    "items.id(id)", 
    "items.itemid(itemid)", 
    "items.name(name)", 
    "items.def(def)", 
    "items.class(class)", 
    "items.timeline(timeline)", 
    "t.id(tagid)", 
    "t.name(tagname)", 
    "f.id(fileid)", 
    "f.name(filename)", 
    "f.path(filepath)", 
    "f.type(filetype)", 
    "tl.tagid" 
]; 
$where = [ 
    "AND" => ["tl.tagid" => $tags], 
    "ORDER" => ["items.id DESC","t.name ASC"], 
    "LIMIT" => [$start,$limit] 
]; 

// Do query 
$results = $db->select($table, $join, $cols, $where); 

あなたはmedooに慣れていない場合は、これはまだクエリはかなり単純に、セットアップ方法を説明しなければなりません。 (クエリはうまく動作し、私が望むすべての結果が得られないだけです)。

ありがとうございました。今週はたくさんのことを学んでいます!

答えて

0

leftside LEFT JOIN rightside ON somethingを実行してからWHERE rightside.column = somethingを実行すると、LEFT JOINをストレートJOINに変換します。

ストレートJOINは、leftsideの行がjoin内のONと一致しないようにします。

だから、あなたのWHERE条件を取り除いてみてください。

編集私はあなたが言及フレームワークを知りません。

しかし、特定のタグIDを持つすべてのアイテムを取得するには、あなたがこれを行います。

 SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags 

次に、あなたが一致するタグを持つだけでアイテムをフィルタリングする

WHERE items.id IN (SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags) 

であなたのメインクエリを行うことができます。メインクエリでは、tagid = $tagsとそれ以外のタグを含むすべてのタグが取得されますが、一致するタグを持つアイテムについてのみ検索されます。それはすべての理論をその中心にしています。

+0

こんにちはOllie、この情報をありがとうございます。何が起こっているのかとインラインに見える。条件や設定が異なる別のスクリプトがあり、目的の結果が得られます。この場合、このスクリプトは特にタグを検索するための回避策を見つける必要があります。 - アイデアは気に入らないが、おそらく2つの別々のクエリがあります。最初はアイテムIDの配列を作成し、2つ目はそれらのIDを選択します。 (なぜ、私の試みのどれもが違いを生み出していない理由を説明しています!ああ、生きて学ぶ:P) – turnfire

関連する問題