我正在使用一个很好的php框架来处理我的数据库medoo.php。链接medoo文档以供参考:http://medoo.in/docMysql获取所有连接记录这两个表
我想要的东西发生:
- 返回连接表,它的一个或多个条件从右表匹配的所有记录。 (主表为'项目')
- 包含右表中的匹配/连接记录。 (在这种情况下,所有'标签'与'物品'相关)。
什么是目前发生的事情:左表(项目)
- 返回记录加入了与右表(标签)。但是,它仅从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,我从'items'中选择并加入标签/ taglist以及左连接(当前)。 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,这应该仍然说明如何设置查询相当简单。 (查询工作正常,我只是没有得到我想要的所有结果)。
谢谢你的任何建议。本周我正在学习很多东西!
嗨Ollie,谢谢你的信息。它似乎与正在发生的事情保持一致。我有其他不同的条件和类似的设置脚本,我得到了预期的结果。在这种情况下,我需要找到解决方法,因为这个脚本专门用于搜索标签。 - 我不喜欢这个想法,但可能是2个独立的查询,第一个创建一个item ID数组,第二个选择这些ID。 (这就解释了为什么我的尝试都没有改变!噢,生活和学习:P) – turnfire