Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 棘手的SQL选择_Mysql_Sql_Stored Procedures_Join - Fatal编程技术网

Mysql 棘手的SQL选择

Mysql 棘手的SQL选择,mysql,sql,stored-procedures,join,Mysql,Sql,Stored Procedures,Join,我有一个消息表,该表包含以下列: id | fromUserId | toUserId | sentDate | readDate | message | subject | fromUserDeleted(bit) | toUserDeleted(bit) 现在我需要选择每个转换中的第一条消息,如果它来自或发送给当前用户,则为no mather。更复杂的是,我需要排除当前用户删除的消息,因此如果消息来自当前用户,则fromUserDeleted必须为0如果消息来自其他用户,则toUserDe

我有一个消息表,该表包含以下列:

id | fromUserId | toUserId | sentDate | readDate | message | subject | fromUserDeleted(bit) | toUserDeleted(bit)
现在我需要选择每个转换中的第一条消息,如果它来自或发送给当前用户,则为no mather。更复杂的是,我需要排除当前用户删除的消息,因此如果消息来自当前用户,则fromUserDeleted必须为0如果消息来自其他用户,则toUserDeleted需要为0

我知道已经有很多关于如何在小组中选择第一篇文章的例子,但这有点复杂。当前用户可能在toUserId或fromUserId中,删除列也是如此

这就是我尝试过的:

SELECT 
    m1.*, 
    (SELECT count(*) FROM mail m3 WHERE m3.fromUserId=m1.fromUserId AND m3.toUserId=m1.toUserId AND m3.toUserDeleted = 0) as messageCount, 
    (SELECT count(*) FROM mail m4 WHERE m4.toUserId=15 AND m4.readDate is null AND m4.toUserDeleted=0) as messagesNotRead 
FROM 
    mail m1 
LEFT JOIN mail m2 ON 
    ((m1.fromUserId = m2.fromUserId) and
    m2.)
WHERE 
    m2.id IS NULL AND 
    (m1.toUserId = 15 OR m1.fromUserId = 15) 
ORDER BY 
    m1.sentDate DESC;
以及:

SELECT 
    * 
FROM 
    mail m1
WHERE
    ((m1.fromUserId = 15 AND m1.fromUserDeleted=0) OR (m1.toUserId = 15 AND m1.toUserDeleted=0)) AND
    m1.id = (SELECT m2.id FROM mail m2 WHERE m2.fromUserId = 15 OR m2.toUserId = 15 OR m2.fromUserId = m1.fromUserId OR m2.fromUserId = m1.toUserId OR m2.toUserId = m1.fromUserId OR m2.toUserId = m1.toUserId order By m2.sentDate desc limit 0,1)
Order by m1.sentDate DESC
这些都不能满足我的需要。求救

如果需要创建存储过程,也可以

重要提示:这是我的MySQL

编辑1:


请查看此示例:

谢谢您的反馈。希望这能满足您的需求:

DECLARE @UserID INT
SELECT @UserID = 15

SELECT *
FROM (
    SELECT UserID, ConversationWithUserID, sentDate, readDate, [message], [subject], ROW_NUMBER() OVER (PARTITION BY ConversationWithUserID ORDER BY sentDate ASC) AS MessageOrder
    FROM (
        SELECT id, fromUserId AS UserID, toUserId AS ConversationWithUserID, sentDate, readDate, [message], [subject]
        FROM dbo.mail
        WHERE fromUserID = @UserID AND fromUserDeleted = 0
        UNION
        SELECT id, toUserId AS UserID, fromUserId AS ConversationWithUserID, sentDate, readDate, [message], [subject]
        FROM dbo.mail
        WHERE toUserId = @UserID AND toUserDeleted = 0
    ) x
) y
WHERE MessageOrder = 1
ORDER BY y.UserID, y.ConversationWithUserID

在同一列下执行UNPIVOT以获取fromUSerId、toUserId,以便我们可以根据sentDate选择正确的userId

SELECT T.*

FROM
(
    SELECT *,

           ROW_NUMBER() OVER ( PARTITION BY userVal ORDER BY sentDate DESC) as seq
    FROM
    (SELECT 
            *

     FROM msg
     WHERE (fromUserId = @userID AND fromUserDeleted = 0 ) 
           OR  (toUserId = @UserID AND toUserDeleted = 0)

    )p
    unpivot
    ( userVal for UserId in ( fromUserId, toUserId)
    )as unpvt
) T
WHERE seq =1 

你能用测试数据和数据库结构准备一个sql脚本吗?还包括一个理想的结果,你想得到的数据。最好是最小化,包括所有可能的情况。对于查询,只有SendDate起作用,readDate不起作用?@user4035我会试试。@Rajesh readData大多数在select中,但它与select逻辑不匹配。消息的组成是什么。如果您的ID列是自动递增的,并且消息可能是正文,并且在发件人/收件人之间更改,那么标识消息ID序列5的是来自原始消息ID 2的响应。主题是否可以通过Fwd和回复邮件进行更改?这将打破这方面的一个共同点。这将选择当前用户参与且未被他/她删除的所有消息。我需要的是一个列表,上面列出了每个对话中发送给/来自所有用户的最后一封邮件。因此,在当前用户和用户A之间,即使他们有100条消息,我们也应该只返回最新消息。当前用户和用户B也是如此。那么如何确定对话呢?我们是否假设所有来回的消息都是一个对话?是的,一个对话是当前用户使用的所有消息。这比我使用的更高级。我试过使用正确的userId编写脚本,但遇到了语法问题:“PARTITION BY userVal ORDER BY sentDate DESC as seq FROM SELECT”我使用的是MS SQL,你的RDBMS是mysql吗?是的,对不起,它是mysql,我有一个mysql标记,但我当然也应该在我的帖子中提到它。