MySQL如果在中选择“否则不工作”

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

我试图执行以下查询,但没有成功。 这是我第一次在SQL中使用if-else语句,您能验证它的错误吗? 谢谢你宝贵的帮助

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!第三个绝对是我想做的!