【发布时间】:2014-09-29 14:47:22
【问题描述】:
我继承了一个遗留代码库和一个带有它的数据库(我无法修改),我在重构代码时遇到了这些查询。如果可能的话,我试图将 4 个单独的查询放在一个中。如果需要,我将提供表模式。另外,如果您认为无法在一个查询中解决,请详细说明。
这些是查询(它是关于运动的),最终目的是获取给定用户创建和/或加入的所有杯子
- cups 表包含创建的杯子、它们的创建者等
- joined table 包含已加入特定杯子的用户,他们已结束的位置(排名)
- registered_cups 表包含杯子的名称
第一个是尝试获取用户创建的所有杯子
SELECT cup_id FROM cups WHERE user_id = 'givenUser' AND cup_type <> 6
第二个是尝试获取用户加入的所有杯子
SELECT joined.cup_id, joined.cup_rank FROM joined LEFT JOIN cups USING (cup_id) WHERE joined.user_id = 'givenUser' AND cups.cup_type <> 6
现在,第一个结果被放入一个逗号分隔的字符串中,然后提供给下一个查询。第三个是读取所选杯子的信息
SELECT cup_id, user_id, status FROM joined WHERE cup_id IN (cupList)
最后一个得到杯子的名称,它们的版本,并订购它们
SELECT name, cup_id, edition, cups.user_id FROM cups LEFT JOIN registered_cups USING(register_id) WHERE cup_id IN (cupList) ORDER BY name ASC, edition DESC
正如你所看到的,有很多重复,而且不需要的东西,所以这就是我想出的:
SELECT cups.cup_id, cups.edition, cups.user_id, joined.cup_rank, registered_cups.name
FROM cups, joined, registered_cups
WHERE cups.cup_id = joined.cup_id
AND cups.register_id = registered_cups.register_id
AND joined.user_id = '308288'
AND cups.cup_type <>6
ORDER BY registered_cups.name ASC , cups.edition DESC
我的查询的问题是我只得到了用户加入的杯子,但也有可能用户创建了一个杯子,但没有参与。这就是前两个查询的原因,但我不知道如何成功组合它们。我希望你能理解我想要达到的目标。
更新:
这里是架构的fiddle,有一点输入。有问题的用户是user_id = 133,它应该基本上选择所有行,即21,其中一个应该是一个有组织但没有被用户加入的杯子,所有其他的都是.
【问题讨论】:
-
您应该使用
LEFT JOIN,而不是隐式连接和按位置过滤