Foreach или Inner присоединиться? - это вопрос PHP - PullRequest
1 голос
/ 15 декабря 2010

У меня есть 2 таблицы.Один (artWork) со всеми данными, которые я хочу получить, включая 2 столбца идентификаторов.Другой (sharedWork) имеет те же 2 столбца идентификаторов, которые также находятся в первом, но ни один из важных данных, которые я хочу вывести.Цель: использовать идентификаторы в обеих таблицах, чтобы отфильтровать строку в первой (artWork).Смотрите ниже в коде то, что я попробовал, но это не сработало

Я также попытался выяснить внутреннее соединение, которое могло бы выполнить то же самое.Там тоже не повезло.Хотите знать, что было бы лучшим подходом и как это сделать.

спасибо Аллену

//////// Get id's first ///////////
$QUERY0="SELECT * FROM artWork WHERE user_id = '$user_id' ";
    $res0 = mysql_query($QUERY0);
 $num0 = mysql_num_rows($res0);
 if($num0>0){
 while($row = mysql_fetch_array($res0)){ 
   $art_id0 = $row['art_id'];
         }
}
$QUERY1="SELECT * FROM shareWork WHERE user_id = '$user_id' ";
    $res1 = mysql_query($QUERY1);
 $num1 = mysql_num_rows($res1);
 if($num1>0){
 while($row = mysql_fetch_array($res1)){ 
   $art_id = $row['art_id'];
 }
}
$art_id2 = array_merge($art_id0, $art_id1);</p>

<p>foreach ($art_id2 as $art_id3){
$QUERY="SELECT * FROM artWork WHERE art_id = '$art_id3' "; 
// echo "id..".$art_id0;
    $res = mysql_query($QUERY);
 $num = mysql_num_rows($res);
 if($num>0){</p>

<p>while($row = mysql_fetch_array($res)){ 
   $art_title = $row['art_title'];
   $art_id = $row['art_id'];
                    etc................and so on
                    .........to....</p>

<code></tr>";
         }
     }
</code>

}

1 Ответ

7 голосов
/ 15 декабря 2010

Не запрашивайте вашу базу данных внутри цикла, если вам абсолютно не нужно.

Каждый раз, когда вы запрашиваете базу данных, вы используете дисковый ввод-вывод, чтобы прочитать базу данных и вернуть вашу запись. Дисковый ввод-вывод является самым медленным чтением на компьютере и будет массивным узким местом для вашего приложения.

Если вы выполняете более крупные запросы заранее или, по крайней мере, вне цикла, вы будете реже ударить по диску, что повысит производительность. Ваши результаты более крупных запросов будут храниться в памяти, что значительно быстрее, чем чтение с диска.


Теперь, с этим предупреждением, давайте рассмотрим вашу актуальную проблему:

Похоже, вы пытаетесь получить записи из artWork, где пользователь является основным исполнителем или пользователь был одним из нескольких исполнителей для работы над групповым проектом. artWork, кажется, содержит идентификатор основного художника в проекте, тогда как shareWork, вероятно, является своего рода таблицей поиска "многие ко многим", которая связывает идентификаторы пользователей со всеми художественными проектами, частью которых они были.

Первое, что я должен спросить: нужен ли вам первый запрос к artWork или если основной художник должен иметь запись для этого art_id в shareWork, так как он вообще работал над проектом.

Если вам не нужен первый поиск, тогда запрос становится очень простым: просто возьмите всех пользователей art_id s из таблицы shareWork и используйте это для поиска его записей в основной artWork таблица:

SELECT artWork.*
FROM artWork
WHERE art_id IN
  (SELECT art_id
   FROM shareWork
   WHERE user_id = $user)

Если вам нужно сделать в обеих таблицах, просто добавьте проверку в запросе выше, чтобы также проверить этого пользователя в таблице artWork:

SELECT artWork.*
FROM artWork
WHERE 
  user_id = $user
OR art_id IN
  (SELECT art_id
   FROM shareWork
   WHERE user_id = $user)

Это даст вам все artWork записей в одном запросе, а не ... ну, много запросов, и вы можете сделать mysql_fetch_array цикл по результатам этого одного запроса. и покончим с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...