我正在使用一个很棒的php框架来处理我的数据库medoo.php。链接到medoo文档以供参考:http://medoo.in/doc
我想要发生的事情:
目前正在发生什么:
让我们获取一些代码来更好地说明问题:
//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,我从'items'中选择并使用left join(当前)加入tags / taglist。 WHERE子句:tag.id匹配要搜索的已发布标记。还在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,这仍然应该说明如何简单地设置查询。 (查询工作正常,我只是没有得到我想要的所有结果)。
感谢您的任何建议。我这周学到了很多东西!
答案 0 :(得分:0)
如果您执行leftside LEFT JOIN rightside ON something
然后执行WHERE rightside.column = something
,则将LEFT JOIN转换为直接加入。
Straight JOIN会阻止leftside
中与联接中的ON
不匹配的行。
所以试着摆脱你的WHERE条件。
修改我不知道你提到的框架。
但是,要获得具有特定tagid的每个项目,请执行此操作。
SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags
然后您可以使用
执行主查询 WHERE items.id IN (SELECT DISTINCT itemid FROM taglist WHERE tagid = $tags)
仅过滤掉具有匹配标记的项目。您的主查询将获取所有标记,包括tagid = $tags
和所有其他标记,但仅限于具有匹配标记的项目。这是所有理论的核心。