MySQL如果在中选择“否则不工作”
我试图执行以下查询,但没有成功。 这是我第一次在SQL中使用if-else语句,您能验证它的错误吗? 谢谢你宝贵的帮助MySQL如果在中选择“否则不工作”,mysql,Mysql,我试图执行以下查询,但没有成功。 这是我第一次在SQL中使用if-else语句,您能验证它的错误吗? 谢谢你宝贵的帮助 SELECT members.id AS friendID, members.username AS friendName, members.mainPicture AS thumbnail, COUNT(*) AS numROW FROM members WHERE m
SELECT
members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail,
COUNT(*) AS numROW
FROM members
WHERE members.id IN (
SELECT (IF (friends.senderID = 9, friends.receiverID,
IF (friends.senderID <> 9, friends.senderID)
)
)
AS fid
FROM friends
WHERE (friends.senderID = 9 OR friends.receiverID = 9) AND friends.approved=1
)
)
最大的问题似乎是您没有GROUPBY子句。COUNT*取决于其在GROUP BY上的正确操作 IF的问题是第二个IF没有其他条件。如果出现以下情况,则可能应为单个:
IF(friends.senderID = 9, friends.receiverID, friends.senderID)
完全回答
一个主要的问题是你没有分组。因此,如果返回多个member.id,它们将全部汇总到一行中。将返回的members.id/username/mainPicture未定义。这也是为什么只返回一行
其次是你的IF条款。IF语句有3个参数。如果第一个为真,则返回第二个,否则返回第三个。在本例中,第三个参数是另一个参数,如果可以,您可以嵌入它们。但如果没有第三个参数
因此,您的SQL可能应该如下所示:-
SELECT members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail,
COUNT(*) AS numROW
FROM members
WHERE members.id IN
(
SELECT IF (friends.senderID = 9, friends.receiverID, friends.senderID) AS fid
FROM friends
WHERE (friends.senderID = 9 OR friends.receiverID = 9)
AND friends.approved = 1
)
GROUP BY members.id AS friendID, members.username AS friendName, members.mainPicture AS thumbnail
这种方法的缺点是,它将IN子句与子查询一起使用,这可能会执行得很奇怪。此外,子查询有两个不同字段的OR,这将阻止它使用索引
假设member.id是唯一的,则每个成员应返回一行,但计数器将始终为1
因此,可能更有效的方法是执行以下操作,我怀疑这会满足您的需求
SELECT members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail,
(f1.aCount + f2.aCount) AS numROW
FROM members
LEFT OUTER JOIN
(
SELECT receiverID, COUNT(*) AS aCount
FROM friends
WHERE senderID = 9
AND approved = 1
GROUP BY receiverID
) f1
ON members.id = f1.receiverID
LEFT OUTER JOIN
(
SELECT senderID, COUNT(*) AS aCount
FROM friends
WHERE receiverID = 9
AND approved = 1
GROUP BY senderID
) f2
ON members.id = f2.senderID
这将获取成员的所有好友记录的计数
如果friends表有一个唯一的id字段,那么您可以使用类似这样的内容,使其能够正确使用索引:-
SELECT members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail,
COUNT(DISTINCT f1.id) + COUNT(DISTINCT f2.id) AS numROW
FROM members
LEFT OUTER JOIN friends f1 ON members.id = f1.receiverID AND f1.senderID = 9 AND f1.approved = 1
LEFT OUTER JOIN friends f2 ON members.id = f2.senderID AND f2.receiverID = 9 AND f2.approved = 1
GROUP BY members.id AS friendID, members.username AS friendName, members.mainPicture AS thumbnail
如果你只是想要一个没有计数的朋友列表,重新阅读你的评论听起来是可能的,那么下面的内容就可以了,而且应该是相当有效的。每个单独的查询都可以使用索引,工会将整理出所有重复的内容:-
SELECT members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail
FROM members
INNER JOIN friends
ON members.id = friends.receiverID
WHERE senderID = 9
AND approved = 1
UNION
SELECT members.id AS friendID,
members.username AS friendName,
members.mainPicture AS thumbnail
FROM members
INNER JOIN friends
ON members.id = friends.senderID
WHERE receiverID = 9
AND approved = 1
请用答案回答,而不是评论。我已经复制了你的答案。你好,Kickstart,thantk对于你的评论,你对单一if的看法是正确的!无论如何,我只得到了1个结果,而我应该得到3个记录。我试着解释一下我在做什么:我需要从朋友那里找到senderID或receiverID=9的所有记录,如果senderID不等于9,则获取senderID作为输出,否则获取receiverID和viceversa。谢谢Kickstart!第三个绝对是我想做的!