【问题标题】:Mysql getting all joined records both tablesMysql获取所有连接记录两个表
【发布时间】:2016-04-12 12:52:49
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql join left-join medoo


    【解决方案1】:

    如果您先执行leftside LEFT JOIN rightside ON something,然后执行WHERE rightside.column = something,您会将LEFT JOIN 转换为直接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 的标签和所有其他标签,但仅适用于具有匹配标签的项目。其核心都是固定理论。

    【讨论】:

    • 嗨,奥利,感谢您提供的信息。这似乎与正在发生的事情一致。我有其他具有不同 where 条件和类似设置的脚本,我得到了想要的结果。在这种情况下,我需要找到一种解决方法,因为该脚本专门用于搜索标签。 - 我不喜欢这个想法,但可能有 2 个单独的查询,第一个创建项目 id 数组,第二个选择这些 id。 (这就解释了为什么我的尝试都没有改变!哦,生活和学习:P)
    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多