0

データベース medoo.php を操作するために、優れた php フレームワークを使用しています。参照用の medoo ドキュメントへのリンク: http://medoo.in/doc

私がしたいこと:

  • 右側のテーブルの 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 は、投稿された tagid に一致して検索します。WHEREでtaglist.tagidも試しました。

返される結果は、予想どおり、WHERE 句に一致するタグを含むすべての「アイテム」です。ただし、検索したタグだけでなく、それらのアイテムに関連するすべてのタグが必要です (これが得られます)。

私はそれが JOIN または 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 に慣れていない場合でも、クエリのセットアップ方法は非常に簡単です。(クエリは問題なく機能します。必要な結果がすべて得られないだけです)。

アドバイスありがとうございます。今週は本当にたくさんのことを学んでいます!

4

1 に答える 1