我正在使用一个很棒的 php 框架来处理我的数据库 medoo.php。链接到 medoo 文档以供参考:http ://medoo.in/doc
我想要发生的事情:
- 返回连接表中的所有记录,其中它与右表中的一个或多个条件匹配。(主表是“项目”)
- 包括来自右表的匹配/连接记录。(在这种情况下返回与“项目”相关的所有“标签”)。
目前正在发生的事情:
- 从与右表(标签)连接的左表(项目)返回记录。但是,它只返回显式包含来自 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,这应该仍然可以说明查询是如何相当简单地设置的。(查询工作得很好,我只是没有得到我想要的所有结果)。
谢谢你的任何建议。这周我学到了很多东西!