2012-06-12 4 views
2

Я получаю кучу идентификаторов из базы данных - для каждого идентификатора я хочу сделать запрос mysql, чтобы связать строку в другой таблице. Это прекрасно работает, хотя мне также необходимо получить аналогичные данные для зарегистрированного пользователя. С запросом mysql, который я использую, он дублирует зарегистрированные данные пользователя в зависимости от того, сколько идентификаторов было изначально вытащено. Это имеет смысл, хотя это не то, что я хочу. Я не хочу дублировать данные для зарегистрированного пользователя, и мне нужно, чтобы данные поступали из одного запроса, поэтому я могу заказать вещи с меткой времени.Дубликаты в php while loop

<?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"; 
    } 
?> 
+0

Использование функций php mysql_ не рекомендуется, ознакомьтесь с функциями mysqli_, это новый, более быстрый и безопасный способ выполнения запросов mysql в php. –

+1

Вероятно, вы должны использовать оператор JOIN, вероятно, вы также должны использовать mysqli или PDO, а не mysql_ *. –

+3

Ваш код также страдает от проблемы [N + 1] (http://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem). –

ответ

1

Вы можете попробовать это один запрос, и посмотреть, если он делает то, что вам нужно

$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"; 
+0

Действительно приятно - cheers – Jeff

+0

Наткнулся на это, и это действительно помогло с моим запросом в запросе, пока проблема цикла у меня есть. Благодарю. +1 –

0

Вы, вероятно, хотите что-то вроде этого:

$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"; 

Вы можете заменить * с полей, но не забудьте поставить имя таблицы перед именем поля:

Имя_таблицы.field_name

Надеюсь, это поможет.

+0

Cheers Frank - первое предложение сработало, но ценю помощь – Jeff

+0

Да, первое предложение выглядит лучше, я бы использовал это над моим: P –