如何让MYSQL加入整个表?

时间:2011-11-09 20:40:49

标签: mysql

我有一个SELECT查询,它根据一个唯一的ID返回响应,所以我总是得到一行。 如果我只是将价格表添加到结果中,我认为可以为我的机器保存额外的SELECT查询,并稍后将其读取到内存中。

这是一个好方法还是我错过了什么? (我尝试了,似乎完成了工作)

SELECT * 
FROM subscriptions
LEFT JOIN prices ON 1=1
WHERE subscriptions.ID = 100

编辑:价格表没有ID。我只需要获得完整的表格,我曾经只为那个

设置了不同的SELECT

6 个答案:

答案 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)

这是一个交叉联接http://en.wikipedia.org/wiki/Join_(SQL)#Cross_join

表示您的结果集将包含prices表中的行数。

所以我想这不是一个好主意