Объединить два запроса MySQL в одном массиве

Цель этого запроса – получить истинное изображение плюс 3 случайных сгенерированных изображения из одной таблицы, а затем показать их случайным образом. Пользователь (ребенок) должен выбрать правильное изображение.

благодаря

$sql= "SELECT * FROM `login` WHERE `user` = '$word'"; " UNION" "SELECT * FROM `login` WHERE `user` != '$word' ORDER BY RAND() LIMIT 3"; $row2=mysql_query($sql); $i=1; while ($r = mysql_fetch_array($row2)) { echo '<td> '; echo '<img src="sigg/'.$r['img'].'" width="130" height="130" /><br>'; echo $r['user']; echo '</td>'; $i++; } 

Используйте предложение UNION :

 $sql = "(SELECT * FROM `login` WHERE `user` = '$word')"; $sql.= " UNION"; $sql.= " (SELECT * FROM `login` WHERE `user` != '$word' ORDER BY RAND() LIMIT 3)"; $sql.= " ORDER BY RAND()"; 

Чтобы получить результаты, вы можете использовать, например, MySQLi (заданный до того, как OP добавил свой код с mysql_* ) :

 $MySQL=new mysqli("localhost", "username", "password", "database"); $query = $MySQL -> query($sql); while ($entry = $query -> fetch_row()) { // $entry is an array with the results, use for example: echo $entry[0]; // will return the first column of your table echo $entry[1]; // will return the second column of your table // try also: var_dump($entry); // outputs everything for testing purposes } 

Пожалуйста, не используйте функции mysql_* , они устарели и будут удалены в будущих версиях PHP. Вместо этого используйте MySQLi или PDO . См. Почему я не должен использовать функции mysql_ * в PHP? Больше подробностей.

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

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

 SELECT * FROM `login` WHERE `user` = '$word' UNION SELECT * FROM `login` WHERE `user` != '$word' ORDER BY RAND() LIMIT 3 

даст вам список записей, в которых user = $word в первой части и случайных 3 других элемента.

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

Вот код php:

 $connection = mysql_connect(HOST, USER, PASSWORD); mysql_select_db(DATABASE_NAME, $connection); $sql = "SELECT img, user FROM `login` WHERE `user` = '{$word}' UNION SELECT img, user FROM `login` WHERE `user` != '{$word}' ORDER BY RAND() LIMIT 3"; $results = mysql_query($sql, $connection); $rows = array(); // Insert results in a new array to shuffle it while ($row = mysql_fetch_array($results)) { $rows[] = array( 'img' => $row['img'], 'user' => $row['user'] ); } shuffle ($rows); // Randomize order // Construct HTML $html = ''; foreach ($rows as $entry) { $html .= '<td><img width="130px" height="130px" src="sigg/' . $entry['img'] . '"> $html .= $user . '</img></td>'; } echo $html; 

Вам нужно будет заменить заглавные слова тем, что необходимо. Несколько объяснений:

  • замените * только тем, что вам нужно из таблиц (используйте меньше памяти)
  • сначала вставьте результаты в массив, чтобы вы могли рандомизировать порядок (из MySQL вы всегда будете иметь первую строку результатов первого запроса)
  • построить html и вывести его все сразу (выполнение множественного echo зависит от буферизации, чтобы не отправлять его в браузер, но этот параметр может быть выключен: что такое буферизация вывода ).