从Triple Inner Join获得正确的结果


Obtain Correct Results from Triple Inner Join

我正在尝试创建一个消息列表,其中每个消息上面都有响应。消息表和响应表由外部id连接。保存数据一切正常。我想展示他自己的留言父亲的回复。

它的工作原理很好,直到我尝试在同一个消息父中保存两个响应时,它会用另一个响应创建另一个消息父亲,而不是在同一消息中同时保存两个回应。

这是

function getFormattedDateTime(dateTimeToFormat) {
    dateTimeToFormat = new Date(dateTimeToFormat);
    var monthOptions = {
        month: 'long', year: 'numeric', day: 'numeric',
        hour: '2-digit', minute: '2-digit'
    };
    return dateTimeToFormat.toLocaleTimeString('en-us', monthOptions);

Sql查询:

$totalMensajesR = mysql_num_rows($numMsgRespuesta);
$totalRows = mysql_num_rows($registroTriple);
  $registroTriple = mysql_query("SELECT 
      mensajes.ID as 'm_ID',
      mensajes.USER_NAME,
      mensajes.CONTENIDO as 'm_CONTENIDO',
      mensajes.FECHA as 'm_FECHA',
      respuestas.ID as 'r_ID',
      respuestas.ID_F as 'r_IDF',
      respuestas.USER_NAME as 'r_USERNAME',
      respuestas.FECHA as 'r_FECHA',
      respuestas.CONTENIDO as 'r_CONTENIDO',
      usuarios.ID_USER as 'u_idUSER',
      usuarios.USER_NAME,
      usuarios.CORREO
      FROM mensajes
        LEFT OUTER JOIN respuestas ON (respuestas.ID_F = mensajes.ID)
        LEFT OUTER JOIN usuarios ON (usuarios.USER_NAME=mensajes.USER_NAME)",$conexion) or die("Problemas en el select:".mysql_error());

我需要显示什么

if ($totalRows!=0){

    while ($row= mysql_fetch_assoc($registroTriple))
                    {
                        echo "<br />";
                        echo "<div id='$row[m_ID]' class='borderMensajes'>";
                        echo "<form name='formulario' action='' onsubmit='enviarDatos(); return false'>";
                        echo "<img id='imagenUsuario' src='getImageFromUsuarios.php?ID=$row[u_idUSER]'/>";
                        //echo "<span class='divDin2'>Product: </span>";
                        echo "<span class='divDin2'>$row[USER_NAME]</span>";
                        echo "<br/><br/>";
                        echo "<span class='divDinamico'>Mensaje: </span>";
                        echo $row["m_CONTENIDO"];
                        echo "<br/><br/>";
                        echo "<span class='divDinamico'>Fecha: </span>";
                        echo $row['m_FECHA'];
                        echo "<br/>";
                        echo "<h5></h5>";
                        echo "<input class='btRespuesta' id='_botonArchivar' onclick='AddResponse($row[m_ID])' name='responder' type='submit' value='Responder'/>";
                        echo "<div>";
                            //$row =  mysql_fetch_assoc($registroTriple);   
                            if ($row['r_IDF']==$row['m_ID'])
                            {
                                echo $row['r_USERNAME'];
                                echo "<span class='divDinamico'>Mensaje: </span>";
                                echo $row["r_CONTENIDO"];
                                echo "<span class='divDinamico'>Fecha: </span>";
                                echo $row["r_FECHA"];
                            }
                        echo "</div>";      
                        echo "<br /><br />";    
                        echo "</form>";
                        echo "</div>";
                    }
            `

我不知道理解是否正确,但我认为。。。

您的这个查询将为您对同一消息的每个响应生成额外的条目因此,如果Message表上有一行,Response表上有三行,则会得到三行示例

  Message ID | Response ID |
  1 | 1
  1 | 2
  1 | 3

在您的php输出中,我看不到任何检测和分组响应的机制,因此每个响应都将显示为另一条消息

我认为您必须将三重联接查询分解为两个查询,一个用于消息,另一个用于响应当你循环消息时,你必须调用响应查询来获得响应

while ($row = mysql_fetch_assoc($sqlMessages)) {
    echo 'Message';
    echo displayResponses($row['messageId']);
}
function displayResponses($messageId) {
    while ($row = mysql_fetch_assoc($sqlResponse)) {
        echo $row['response'];
    }
}

我希望这能有所帮助。