データベース 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 に慣れていない場合でも、クエリのセットアップ方法は非常に簡単です。(クエリは問題なく機能します。必要な結果がすべて得られないだけです)。
アドバイスありがとうございます。今週は本当にたくさんのことを学んでいます!