【问题标题】:Select query for tags in SQL在 SQL 中选择标签查询
【发布时间】:2014-12-11 03:37:59
【问题描述】:

我在 sql 中的联接方面的知识非常有限。我有一个用于选择标签的表格。我正在使用多对多关系。

我的表结构如下:

table links
id, name, url

table tags
id, tag

table tagsmap
id, tagid, linkid

现在,如何选择与特定链接对应的标签?我正在使用 Laravel。

我试过了:

DB::table('links')
            ->join('tags', 'link.id', '=', 'tags.link_id')
            ->join('tagmaps', 'link.id', '=', 'tagmpas.link_id')
            ->select('tags.tag')
            ->get();

【问题讨论】:

  • 您已经尝试过哪些查询?
  • 为什么我得到了反对票?
  • 我对你投了反对票,因为你原来的问题不是问题,而且你没有详细说明你尝试了什么
  • 好的,我现在刚刚添加了它们。 (希望您可以只发表评论而不是投反对票)
  • 点击比输入回复更容易——但是是的,您确实以一种很好的方式进行了编辑,因此将删除

标签: php sql laravel


【解决方案1】:

将where() 子句添加到Michael posted 的SQL 以仅返回您感兴趣的链接的标签。

要获取给定$url 的所有tags:

DB::table('links')
        ->join('tagmaps', 'link.id', '=', 'tagmaps.linkid')
        ->join('tags', 'tags.id', '=', 'tagmaps.tagid')
        ->select('tags.tag', 'links.url', 'tags.id') // add more fields as needed
        ->where('url', $url)
        ->get();

并获取给定$tag 的urls:

DB::table('tags')
        ->join('tagmaps', 'tag.id', '=', 'tagmaps.tagid')
        ->join('links', 'links.id', '=', 'tagmaps.linkid')
        ->select('tags.tag', 'links.url', 'tags.id') // add more fields as needed
        ->where('tags.tag', $tag)
        ->get();

更好的是为您的链接和标签模型设置 Eloquent (many to many):

链接模型:

class Link extends Eloquent {

    protected $table = 'links';

    public function tags()
    {
        // you have to specify the table and the joining IDs here, as you 
        // are not using what Laravel would expect.
        // laravel expects the table to be called "map_tag" and the fields of 
        // that table to be link_id and tag_id, but it's configurable:
        return $this->belongsToMany('Tag', 'tagsmap', 'linkid', 'tagid');
    }
}

标签模型:

class Tag extends Eloquent {

    protected $table = 'tags';

}

然后您可以通过 Eloquent 访问任何给定链接的标签:

 $tags = Link::where('url', $url)->first()->tags;

我没有在这里测试过,但这应该适合你

【讨论】:

  • 好的,我会检查一下。我现在在手机里。是的,我有网址。用例是我想要显示与特定链接关联的所有标签的地方。
  • @user1012181 我没有测试过它,但它应该可以工作......我已经重新排序了连接,以根据 tagmaps 表加入表,这在以前没有做过。祝你好运!
  • @user1012181,太好了!很高兴听到它!
  • 如果我想根据标签选择链接怎么办?
  • @user1012181 你只需反过来做同样的事情!在适当的地方交换标签的链接
【解决方案2】:

只需INNER JOIN 即可解决:

SELECT tags.tag as tag, links.name as links_name, links.url as url FROM tagsmap
  INNER JOIN tags ON tagsmap.tagid = tags.id
  INNER JOIN links ON tagsmap.linkid = links.id
WHERE tagsmap.id = "" //GIVE YOUR CONDITION HERE

愉快的编码

更新

DB::table('tagsmap')
        ->join('tags', 'tagsmap.tagid', '=', 'tags.id')
        ->join('links', 'tagsmap.linkid', '=', 'links.id')
        ->select('tags.tag,links.name,links.url')
        ->get();

我在 LAVAREL 方面做得不好,但我正在努力理解其中的逻辑。根据您对 LAVAREL 的了解编辑我的代码

【讨论】:

  • 你能用我提供的 Laravel 语法试试吗?
  • 问题出在哪里?
  • 我得到了所有的标签。
  • @user1012181 该查询中没有where 子句,因此您将得到所有内容,因为您没有过滤结果
  • @msturdy:你能帮我解决这个问题吗?
猜你喜欢
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多