【发布时间】:2013-06-07 08:28:30
【问题描述】:
我想检索所有产品的列表,以及给定时期的相关价格。
产品表:
Id
Name
Description
价格表:
Id
Product_id
Name
Amount
Start
End
Duration
这里最重要的一点是,一个产品可以有多个价格,即使是在同一时期,但不是在相同的持续时间。 例如,“2013-06-01 -> 2013-06-08”的价格和“2013-06-01 -> 2013-06-05”的价格
所以我的目标是在给定的时期内检索所有产品的列表,例如按 10 个产品分页,并加入该时期内存在的价格。
这样做的基本方法是:
SElECT *
FROM product
LEFT JOIN prices ON ...
WHERE prices.start >= XXX And prices.end <= YYY
LIMIT 0,10
使用这个简单的解决方案时的问题是,我不能只检索 10 个产品,而是 10 个产品*价格,这在我的情况下是不可接受的。
所以解决办法是:
SElECT *
FROM product
LEFT JOIN prices ON ...
WHERE prices.start >= XXX And prices.end <= YYY
GROUP BY product.id
LIMIT 0,10
但这里的问题是,我只会为每个产品检索“1”个价格。
所以我想知道处理这个问题的最佳方法是什么。 例如,我可以使用组函数,如“group_concat”,并在字段中检索字符串中的所有价格,如“200/300/100”等。这看起来很奇怪,需要在服务器语言端进行工作才能转换为可读信息,但它可以工作。
另一种解决方案是为每个价格使用不同的列,具体取决于持续时间:
SELECT
IF( NOT ISNULL(price.start) AND price.duration = 1, price.amount , NULL) AS price_1_day
---- same here for all possible durations ---
From ...
我想Thta 也可以(但我不确定这是否可行),但我可能需要创建大约 250 列来涵盖所有可能性。 这是一个安全的选择吗?
任何帮助将不胜感激
【问题讨论】:
-
由于您仅限于 10 种产品,因此您有 2 个选项:如您所说使用
GROUP_CONCAT或有 2 个查询,一个用于产品,一个用于价格,并加入客户部分的数据。第二个会给你更多的灵活性 -
如果使用组连接,请记住默认长度限制为 1024 个字符。除非您有很多很多价格,否则这应该不是问题。如果需要,可以通过 group_concat_max_len 系统变量进行更改。
-
您想要记录 10 个产品或每个产品最多 10 个记录,我对您的方法有点困惑。
-
我想要第 10 个产品记录,以及所有相关价格。将我的帖子编辑得更清楚
标签: mysql database database-design