【问题标题】:Mysql pivot join failsMysql 枢轴连接失败
【发布时间】:2020-04-28 16:57:32
【问题描述】:

我有以下表格

标签

id | tag_name | slug |
1 | tag1 |tag1
2 | tag1 |tag1

产品

id | proudct_name
1|product1
2|product2

product_tags

id | product_id | tag_id 

1|1||1
2|1|2
3|2|1

我只需要检索同时属于 tag1 和 tag2 的产品

select * from `products` INNER JOIN product_tags ON products.id=product_tags.product_id

INNER JOIN tags ON tags.id=product_tags.tag_id WHERE product_tags.tag_id=1 AND product_tags.tag_id=2

但我的查询返回空结果

【问题讨论】:

  • 您的 1 个明确的具体问题是什么?请在代码问题中提供minimal reproducible example--cut & paste & runnable code;具有期望和实际输出(包括逐字错误消息)的示例输入(作为初始化代码);标签和版本;明确的规范和解释。对于包含 DBMS 和 DDL 的 SQL,其中包括约束、索引和表格初始化。当你得到一个你不期望的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意想不到的子表达式及其输入和输出。 (调试基础。)问这个。

标签: mysql sql join pivot-table


【解决方案1】:

这将查看两个表中的产品:

select * from `products` a where exists(select 1 from product_tags b where b.tag_id = 1 and a.product_id = b.product_id) and exists(select 1 from product_tags b where b.tag_id = 2 and a.product_id = b.product_id)

【讨论】:

  • @zip.你的答案是正确的,就 mysql.do 你知道我如何在 php 或 laravel 中实现这一点
  • @vision,我不知道 laravel,但是我的查询使用了“exists”关键字,可以在这里找到 laravel 中的等效项:stackoverflow.com/questions/50711923/…
【解决方案2】:

你可以用inner join 做你想做的事,这似乎是你正在尝试的。你只需inner join 两次:

select p.*
from products p join
     product_tags pt1
     on pt1.product_id = p.id and pt1.tag_id = 1 join
     product_tags pt2
     on pt2.product_id = p.id and pt2.tag_id = 2;

这可能更容易在 Laravel 中编写代码。

您的版本不起作用,因为标签不能同时是“1”和“2”——它可以有不同的行具有这些值,但每行只有一个值。

此外,查询不需要tags 表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多