【问题标题】:Having limits on joined tables?对连接表有限制?
【发布时间】:2015-03-12 00:58:10
【问题描述】:

尝试构建允许多个收件人的线程消息传递模块。为此,我有一个收件人表,每行包含一个 message_id 和收件人 ID。下面我创建了一个用户消息列表。该代码有效,但由于创建连接的方式,如果有多个收件人,我会多次收到相同的消息消息,这使得无法限制唯一消息的数量。

是否可以对消息数量添加限制但仍检索收件人列表,可能在语句中使用另一个选择?

我猜该语句下面的 php 准确地显示了我想要实现的目标。

$query = mysql_query(

    "SELECT
        messages.message_id,
        messages.message_parent_id,
        messages.message_from_id ,
        messages.message_from_email,
        messages.message_subject,
        messages.message_body,
        messages.message_sent_datetime,

        u_from.forename AS from_forename,
        u_from.surname AS from_surname,

        m_recipients.recipient_user_id AS recipient_user_id,

        u_to.forename AS to_forename,
        u_to.surname AS to_surname

    FROM messages

    INNER JOIN users AS u_from ON messages.message_from_id = u_from.user_id
    INNER JOIN message_recipients AS m_recipients ON messages.message_id = m_recipients.recipient_message_id
    INNER JOIN users AS u_to ON m_recipients.recipient_user_id = u_to.user_id

    WHERE m_recipients.recipient_user_id = 1 OR messages.message_from_id = 1

    ORDER BY messages.message_sent_datetime DESC

    ");

$messages = [];

while($row=mysql_fetch_array($query))       {

    if (array_key_exists($row['message_id'], $messages)) {
        $messages[$row['message_id']]['to'][] = $row['to_forename'] . ' ' . $row['to_surname'];
    }
    else {
        $messages[$row['message_id']] = [
            'to'       => [$row['to_forename'] . ' ' . $row['to_surname']],
            'from'     => $row['from_forename'] . ' ' . $row['from_surname'],
            'subject'  => $row['message_subject'],
            'body'     => $row['message_body'],
            'datetime' => $row['message_sent_datetime']
        ];
    }
}

【问题讨论】:

  • 你在ORDER BY之前尝试过GROUP BY messages.message_id吗?
  • 当然可以,但这意味着我最多只能为每条消息获得一个收件人
  • 不确定你到底想要什么。您能解释一下您实际想要返回的内容吗:例如,用户发送的最后 5 条消息以及每条发送的消息的收件人列表。我的直觉是您需要使用 GROUP_CONCAT 但请先说明您想要什么。

标签: php mysql sql


【解决方案1】:

下面将返回消息,其中 from 和 to 名称以逗号分隔。

这样就够了吗?

    SELECT
    messages.message_id, messages.message_parent_id, messages.message_from_id ,
    messages.message_from_email, messages.message_subject, messages.message_body,
    messages.message_sent_datetime,

    GROUP_CONCAT(CONCAT(u_from.forename, ' ', u_from.surname)) as from,
    GROUP_CONCAT(CONCAT(u_to.forename, ' ', u_to.surname)) as to

FROM messages

INNER JOIN users AS u_from ON messages.message_from_id = u_from.user_id
INNER JOIN message_recipients AS m_recipients ON messages.message_id = m_recipients.recipient_message_id
INNER JOIN users AS u_to ON m_recipients.recipient_user_id = u_to.user_id

WHERE m_recipients.recipient_user_id = 1 OR messages.message_from_id = 1
GROUP BY messages.message_id
ORDER BY messages.message_sent_datetime DESC

你可能想玩 GROUP_CONCAT(DISTINCT)

【讨论】:

  • 谢谢,这正是后来的结果,第一次使用 group_concat。我做了一些修改: CONCAT(u_from.forename, ' ', u_from.surname) as from_x, GROUP_CONCAT(CONCAT(u_to.forename, ' ', u_to.surname)) as to_x 因为from是mysql保留的,我没有需要对 from 列进行分组,因为只有一个发件人。再次感谢
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多