MySQL查询的交叉表选择
包: 的package_id邀请,USER_IDMySQL查询的交叉表选择
交易: PRODUCT_ID,USER_ID,package_id与
我想选择在交易行已package_id与空或0 但只有当有其他具有相同的user_id的交易,其中包裹ID大于0 是可能的。对不起,英语不好......我尝试了一下它,但无法猜出Google查询的正确问题。
我知道标题不好,所以请有人提出一个更好的。
Gwynnbleid1
也许这......我尽量避免子选择不惜一切代价,所以它可以得到疯狂,有点混乱,我从来没有真正知道它是否正常工作,直到我尝试。
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
这给了我无尽的想要的东西。第一个答案也是可以的,但我会把它标记为最终的,因为这种方法应该更有效率。感谢大家:)我一直都知道这个网站是发布问题的最佳地点,但这是我第一次自己提出一个问题。 – Gwynnbleid1 2011-05-13 20:28:58
很高兴工作! – 2011-05-13 20:38:07
该查询会给你所有的交易为package_id > 0
谁拥有了NULL
或0
package_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;
虽然这会起作用,尤其是作为一次性使用,但不建议将大量记录集用于IN,它确实可以减慢查询速度。如果您要在应用程序中多次运行此查询,那么有更有效的方法。 – invertedSpear 2011-05-13 17:26:37
@invertedSpear:我绝对更喜欢JOIN来表现性能,但我觉得这更容易理解。 – 2011-05-13 17:33:32
这一个为我工作,并可能被标记为答案,但对于上述意见,我决定标记其他方式的方法。对不起(我试图标记所有好的答案,因为我只会使用这个查询来搜索错误(所有的翻译应该在包中,或所有的应该设置为空)) – 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
这一个给了我一个错误: #1064 - 你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在附近使用正确的语法'(SELECT * FROM transactions WHERE package_id not null)B WHERE A'在第4行 我不知道为什么... – Gwynnbleid1 2011-05-13 20:26:09
FWIW错误是'package_id为空之后第2行缺少的逗号))A' – 2011-05-13 21:47:24
欢迎来到Stackoverflow。你在哪里受到伤害?它是否理解查询?此外,您必须向我们展示您迄今为止所做的工作。 – Mahesh 2011-05-13 17:16:09
我只想让大家知道一个很好的网站,可以找到像这样的问题(这是一个有很多选项的SQL美化工具):http://www.dpriver.com/pp/sqlformat.htm – 2011-05-13 17:22:01
感谢您的快速响应! ! – Gwynnbleid1 2011-05-13 20:13:24