MySQL查询的交叉表选择

问题描述:

包: 的package_id邀请,USER_IDMySQL查询的交叉表选择

交易: PRODUCT_ID,USER_ID,package_id与

我想选择在交易行已package_id与空或0 但只有当有其他具有相同的user_id的交易,其中包裹ID大于0 是可能的。对不起,英语不好......我尝试了一下它,但无法猜出Google查询的正确问题。

我知道标题不好,所以请有人提出一个更好的。

Gwynnbleid1

+0

欢迎来到*。你在哪里受到伤害?它是否理解查询?此外,您必须向我们展示您迄今为止所做的工作。 – Mahesh 2011-05-13 17:16:09

+0

我只想让大家知道一个很好的网站,可以找到像这样的问题(这是一个有很多选项的SQL美化工具):http://www.dpriver.com/pp/sqlformat.htm – 2011-05-13 17:22:01

+0

感谢您的快速响应! ! – Gwynnbleid1 2011-05-13 20:13:24

也许这......我尽量避免子选择不惜一切代价,所以它可以得到疯狂,有点混乱,我从来没有真正知道它是否正常工作,直到我尝试。

SELECT DISTINCT T.* 
FROM packages P 
     LEFT JOIN transactions T 
     ON P.user_id = T.user_id 
     LEFT JOIN transactions T2 
     ON T.user_id = T2.user_id 
WHERE (T.package_id IS NULL 
      OR T.package_id = 0) 
     AND T2.package_id > 0 
+0

这给了我无尽的想要的东西。第一个答案也是可以的,但我会把它标记为最终的,因为这种方法应该更有效率。感谢大家:)我一直都知道这个网站是发布问题的最佳地点,但这是我第一次自己提出一个问题。 – Gwynnbleid1 2011-05-13 20:28:58

+0

很高兴工作! – 2011-05-13 20:38:07

该查询会给你所有的交易为package_id > 0谁拥有了NULL0package_id至少一种其他交易的用户。

SELECT * FROM transactions WHERE user_id IN 
(SELECT user_id FROM transactions WHERE package_id IS NULL OR package_id = 0) 
AND package_id > 0; 
+0

虽然这会起作用,尤其是作为一次性使用,但不建议将大量记录集用于IN,它确实可以减慢查询速度。如果您要在应用程序中多次运行此查询,那么有更有效的方法。 – invertedSpear 2011-05-13 17:26:37

+0

@invertedSpear:我绝对更喜欢JOIN来表现性能,但我觉得这更容易理解。 – 2011-05-13 17:33:32

+0

这一个为我工作,并可能被标记为答案,但对于上述意见,我决定标记其他方式的方法。对不起(我试图标记所有好的答案,因为我只会使用这个查询来搜索错误(所有的翻译应该在包中,或所有的应该设置为空)) – Gwynnbleid1 2011-05-13 20:24:57

SELECT A.* FROM 

(SELECT * FROM TRANSACTIONS WHERE (package_id = 0 or package_id is null)) A 
(SELECT * FROM TRANSACTIONS WHERE package_id is not null) B 

WHERE A.userID = B.userID 
+0

这一个给了我一个错误: #1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在附近使用正确的语法'(SELECT * FROM transactions WHERE package_id not null)B WHERE A'在第4行 我不知道为什么... – Gwynnbleid1 2011-05-13 20:26:09

+0

FWIW错误是'package_id为空之后第2行缺少的逗号))A' – 2011-05-13 21:47:24