Можно ли выполнить этот запрос без цикла? - PullRequest
1 голос
/ 14 декабря 2009

Итак, в основном, у меня есть таблица MySQL с именем 'themes', а другая, например, с именем 'answers'. В таблице 'themes' есть поле 'relforum', которое связывает эту тему с разделом форума. А в таблице «ответы» есть поле «reltopic», которое связывает ответ с темой. Обе таблицы имеют поле идентификатора, первичный ключ auto_increment.

Теперь я хочу выбрать все ответы на определенном форуме. Поскольку в поле «ответы» нет поля «relforum», мой путь будет таким:

  • Выберите все темы с 'relforum', равным данному форуму, и просмотрите их
  • Находясь в цикле, выберите все ответы из темы, которая сейчас обрабатывается
  • Объединение всех результатов fetch_array в один многомерный массив, а затем их повторение.

Это примерно так:

$query = mysql_query("SELECT * FROM `topics` WHERE `relforum` = '1'");
while($array = mysql_fetch_array($query)) {
    $temp = mysql_query("SELECT * FROM `replies` WHERE `reltopic` = {$array['id']}");
    $results[] = mysql_fetch_array($temp);
}

Есть ли способ объединить все это в меньшее количество запросов? Потому что этот процесс в основном запускает один запрос на тему в этом форуме плюс один. Это было бы слишком много: P

Добавление поля relforum в таблицу ответов - это решение (я все еще разрабатываю часть БД, поэтому добавить ее не проблема), но хотелось бы посмотреть, есть ли решение.

Я действительно плохо разбираюсь в SQL, я знаю только базовые SELECT / INSERT / UPDATE, и я обычно генерирую последние два с помощью PHPMyAdmin, так что ... думаю, мне нужна помощь.

Спасибо за чтение!

Ответы [ 5 ]

4 голосов
/ 14 декабря 2009

Вам нужно научиться пользоваться объединениями. Ссылка ниже предназначена для SQL-сервера, но теория для mySQl практически одинакова для базовых объединений. Пожалуйста, не используйте запятые соединения, так как они устарели на 18 лет и являются практикой porr. Научитесь использовать стандартные соединения ANSII.

http://www.tek -tips.com / faqs.cfm? FID = 4785

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

3 голосов
/ 14 декабря 2009
SELECT 
      r.*
FROM 
      replies r
INNER JOIN
      topics t
ON 
      r.reltopic = t.id
WHERE 
      t.relforum = 1;
2 голосов
/ 14 декабря 2009
SELECT r.* FROM replies r, topics t
WHERE t.relforum = 1 AND r.reltopic = t.id

избавиться от обратных кавычек. они нестандартные и загромождают код

2 голосов
/ 14 декабря 2009

Да, вы должны использовать присоединиться здесь. Однако вам нужно будет проявлять большую осторожность при обработке набора результатов.

Объединения являются основным запросом в схеме реляционной базы данных. Добавьте их в свой арсенал знаний:)

2 голосов
/ 14 декабря 2009

Вам нужно объединить две таблицы.

SELECT * FROM `replies`, `topics` WHERE `replies`.`reltopic` = `topics`.`id` AND `topics`.`relforum` = '1';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...