Mysql获取所有连接记录两个表

时间:2016-04-12 12:52:49

标签: php mysql join left-join medoo

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

感谢您的任何建议。我这周学到了很多东西!

1 个答案:

答案 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和所有其他标记,但仅限于具有匹配标记的项目。这是所有理论的核心。