2016-04-12 56 views
0

我正在使用一个很好的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,这应该仍然说明如何设置查询相当简单。 (查询工作正常,我只是没有得到我想要的所有结果)。

谢谢你的任何建议。本周我正在学习很多东西!

回答

0

如果你做leftside LEFT JOIN rightside ON something然后做WHERE rightside.column = something你将左加入转换成直接加入。

直接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以及所有其他标签,但仅限于具有匹配标签的商品。这一切都是集合论的核心。

+0

嗨Ollie,谢谢你的信息。它似乎与正在发生的事情保持一致。我有其他不同的条件和类似的设置脚本,我得到了预期的结果。在这种情况下,我需要找到解决方法,因为这个脚本专门用于搜索标签。 - 我不喜欢这个想法,但可能是2个独立的查询,第一个创建一个item ID数组,第二个选择这些ID。 (这就解释了为什么我的尝试都没有改变!噢,生活和学习:P) – turnfire