gpt4 book ai didi

mysql - 如何与多态 has_many 'through' 进行连接?

转载 作者:行者123 更新时间:2023-11-29 23:56:20 26 4
gpt4 key购买 nike

<小时/>

我有以下数据结构(简化),其中包括购买表(MySql)中的多态关联

Purchases
product_type (this refers to a table, book, dvd, shirt,...)
product_id (this refers to the product's id in the table in product_type)
amount

Books
category_id

DVDs
category_id

Shirts
category_id

Categories
name

我想从数据库中选择类别,按总销售额 (purchases.amount) 排序。如何使用联接和聚合函数来做到这一点?

我为此制作了一个sqlfiddle:

http://sqlfiddle.com/#!2/74705

最佳答案

多态 ID 类似于数据库中的继承结构,因为要查询所有这些 ID,通常必须使用联合。

但是,如果您的 Books/Shirts/DVD 表没有公共(public)列,则对它们进行查询绝对没有意义。如果它们确实有公共(public)列,那么将其拉出到作为其他列的基础的父产品表中可能更有意义。

例如,如果您想要每种产品的总销售额,您只需这样做

Select sum(amount), product_id -- or product_type if you wanted sales per type
From Purchases
Group By product_id -- product_type

您可以像这样提取产品标题:

Select sum(p.amount), p.product_id, b.Title
From Purchases p
Inner Join Books b on b.category_id = p.product_id
Group By product_id
Union
Select sum(p.amount), p.product_id, s.Title
From Purchases p
Inner Join Shirts s on s.category_id = p.product_id
Group By product_id

先进行并集,然后再进行分组,可能会更高效。

我对继承层次结构的经验是,您应该尽一切努力避免联合。它们查询起来很痛苦,会导致非 DRY 查询,并且性能很差。这意味着将诸如标题之类的共性提取到适当的规范化结构中,以避免必须跨具体/派生类型进行查询。这基本上就是 Wrikken 在评论中提到的“通常,更好的方法是使用具有共享信息类型的产品表”

关于mysql - 如何与多态 has_many 'through' 进行连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25317438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com