我有一个SELECT查询,它根据一个唯一的ID返回响应,所以我总是得到一行。 如果我只是将价格表添加到结果中,我认为可以为我的机器保存额外的SELECT查询,并稍后将其读取到内存中。
这是一个好方法还是我错过了什么? (我尝试了,似乎完成了工作)
SELECT *
FROM subscriptions
LEFT JOIN prices ON 1=1
WHERE subscriptions.ID = 100
编辑:价格表没有ID。我只需要获得完整的表格,我曾经只为那个
设置了不同的SELECT答案 0 :(得分:3)
这看起来很糟糕......您应该使用您(应该/应该)拥有的外键将订阅表加入价格表。
假设您的价格表有一个订阅ID列,那么您的查询应该如下所示:
SELECT *
FROM subscriptions LEFT JOIN prices ON subscriptions.ID=prices.ID
WHERE subscriptions.ID=100
答案 1 :(得分:3)
这样做会产生一个笛卡尔联盟 - 不是太糟糕,因为你将'订阅'方面限制在单个记录中,但仍然会产生与价格方面的记录一样多的行。如果这种情况变得糟糕,那么当你在两边都有多排时。然后得到n x m
结果 - 想想如果你有1000个订阅加入1000个价格,那么结果集会有多大:50,000 x 1,000 = 5000万个结果行。
答案 2 :(得分:2)
首先,除非表之间存在实际关系,否则这种方法比两个SELECT语句要清楚得多。其次,它可能会变慢,因为你传输了更多的数据(每行价格另外获得了复制订阅的所有字段)。
如果订阅和价格 相关,您希望更改该ON条件以使用该关系,因此您只需提取所需的数据。
SELECT *
FROM subscriptions s LEFT JOIN prices p ON (s.subscription_id = p.subscription_id)
WHERE s.subscription_id = 100
你绝对不想做的一件事是:
SELECT *
FROM subscriptions s LEFT JOIN prices p ON (1=1)
因为它会拉动完整的笛卡尔积。一旦你的表变得足够大,那将使你离开临时表空间。
答案 3 :(得分:2)
为什么你的病情 1 = 1 ? 我的事情必须是这样的:
SELECT s.*,p.*
FROM subscriptions as s
LEFT JOIN prices as p ON p.product_id=s.product_id
WHERE s.ID = 100
向我展示您的全部表格订阅和价格,以便为您提供帮助
答案 4 :(得分:1)
此?
SELECT *
FROM subscriptions, prices
WHERE subscriptions.ID = 100
你会得到这样糟糕的结果,但似乎这就是你想要的。
行数较少的表将重复其行。同样,这是不一个好习惯。 使用两个SELECT。
答案 5 :(得分:0)