Duplicados en php while loop

Obtengo un montón de identificaciones de la base de datos: para cada identificación, quiero hacer una consulta mysql para obtener la fila correspondiente en otra tabla. Esto funciona bien, aunque también necesito obtener datos similares para el usuario que inició sesión. Con la consulta mysql que estoy usando, duplica los datos de usuario registrados de acuerdo con la cantidad de identificaciones que extrajo originalmente. Esto tiene sentido, aunque no es lo que quiero. No quiero datos duplicados para el usuario que inició sesión y necesito que los datos provengan de una consulta para poder ordenar cosas con la marca de tiempo.

<?php
    mysql_select_db($database_runner, $runner);
    $query_friends_status = "SELECT DISTINCT rel2 FROM friends WHERE rel1 = '" . $_SESSION    ['logged_in_user'] . "'";
    $friends_status = mysql_query($query_friends_status, $runner) or die(mysql_error());
    $totalRows_friends_status = mysql_num_rows($friends_status);

    while($row_friends_status = mysql_fetch_assoc($friends_status))
    {
        $friends_id = $row_friends_status['rel2'];
        mysql_select_db($database_runner, $runner);
        $query_activity = "SELECT * FROM activity WHERE user_id = '$friends_id' OR user_id = '" .  $_SESSION['logged_in_user'] . "' ORDER BY `timestamp` DESC LIMIT 15";
        $activity = mysql_query($query_activity, $runner) or die(mysql_error());
        $totalRows_activity = mysql_num_rows($activity);
        echo "stuff here";
    }
?>

preguntado el 12 de junio de 12 a las 17:06

No se recomienda el uso de las funciones de php mysql_, consulte las funciones de mysqli_, esta es una forma más nueva, rápida y segura de realizar consultas de mysql en php. -

Probablemente debería usar una instrucción JOIN, probablemente también debería usar mysqli o PDO y no mysql_*. -

Su código también sufre de la Problema N+1. -

genial, no sabía el nombre de esta mala implementación :-) -

Gracias chicos - Shredder me llevó a una consulta. Buscará en mysqli -

3 Respuestas

Puede probar esta consulta única y ver si hace lo que necesita

$userID = $_SESSION['logged_in_user'];
"SELECT * FROM activity WHERE user_id IN (
    SELECT DISTINCT rel2 FROM friends 
    WHERE rel1 = '$userID')
OR user_id = '$userID' ORDER BY `timestamp` DESC LIMIT 15";

Respondido el 12 de junio de 12 a las 17:06

Tropecé con esto, y realmente ayudó con mi consulta dentro de la consulta mientras tengo un problema de bucle. Gracias. +1 - adam joseph looze

Probablemente quieras algo como esto:

  $user = $_SESSION['logged_in_user'];
  $query_friends_status = "SELECT * FROM friends, activity WHERE activity.user_id = friends.rel2 AND rel1 = '$user' ORDER BY `timestamp` DESC LIMIT 15";

Puede reemplazar * con los campos que desee, pero recuerde poner el nombre de la tabla antes del nombre del campo como:

nombre_tabla.nombre_campo

Espero que esto ayude.

Respondido el 12 de junio de 12 a las 17:06

Saludos, Frank: la primera sugerencia funcionó, pero agradezco la ayuda. Jeff

Sí, la primera sugerencia se ve mejor, la usaría sobre la mía: P - dave_peachy

 <?php
    require_once "connect.php";

    $connect = @new mysqli($host, $db_user, $db_password, $db_name); 
    $result = $connect->query("SELECT p.name, p.user, p.pass, p.pass_date_change,p.email, p.pass_date_email, d.domain_name, d.domain_price, d.domain_end, d.serwer, d.staff, d.positioning, d.media FROM domains d LEFT JOIN persons p 
    ON d.id_person = p.id AND d.next_staff_id_person != p.id");

    if($result->num_rows > 1)
    {   
    while($row = $result->fetch_assoc())
    {

echo '<td class="box_small_admin" data-column="Imię i nazwisko"><div class="box_admin">'.$row["name"].'</div></td>';
echo '<td class="box_small_admin" data-column="Domena"><div class="box_admin">'.$row["domain_name"].'</div></td>';          
}}
?>

Respondido 18 Oct 19, 13:10

¡Bienvenido a SO! Cuando responda a una pregunta, no solo publique el código, por favor, explíquelo un poco. Si hay respuestas adicionales, intente exponer las ventajas de su código. - David García Bodego

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.