Вложеные запросы, медлнее или также?

JIEXA

Новичок
Вложеные запросы, медлнее или также?

Привет!

Имеем 3 таблицы:
comments(MyISAM)
- id
- news_id

comments_full(InnoDB)
- comment_id
- comment_parent
- comment_level
- comment_fieldOrder
- user_id
- comment_message

users
- user_id
- user_avatar
- user_name

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

Есть два по сути одинаковых решения:

Первое решение(сначало вытаскиваем ID, затем пихаем в массив и потом делаем выборку камментов с определенными ID)

PHP:
<?
$query= $db->query("SELECT id
						FROM comments 
						WHERE news_id = '".$news_id."'");	
						
	$news_ids = array();					
						
	while($data = $db->get_array($query)) array_push($news_ids, $data['id']);				
										
	$query= $db->query("SELECT cf.comment_level, cf.comment_message, cf.comment_datepost,
							   u.user_name, u.user_avatar
						FROM   comments_full AS cf,
							   users AS u
						WHERE
							   cf.comment_id IN ('".implode("','", $news_ids)."') and
							   cf.user_id = u.user_id
						ORDER BY cf.comment_fieldOrder");
?>

Второе(в условие WHERE подставляем вложенный запрос)

PHP:
<?
$query= $db->query("SELECT cf.comment_level, cf.comment_message, cf.comment_datepost,
							   u.user_name, u.user_avatar
						FROM   comments_full AS cf,
							   users AS u
						WHERE
							   cf.comment_id IN (SELECT id FROM comments WHERE news_id = '".$news_id."') and
							   cf.user_id = u.user_id
						ORDER BY cf.comment_fieldOrder");
?>
Что скажите? Как правильнее?
 

JIEXA

Новичок
Это нужно забить БД юзеров, комментов.
Да и вообще чисто теоритически хотелось бы узнать что быстрее и почему. На форуме я задаю вопрос не для того, чтоб мне сказали "первый".
А для того, чтобы сказали и объснили почему, чтоб в будущем не возникало подобных вопросов.
 

Gas

может по одной?
IN (SELECT ...) в mysql пока ещё зло, сделай для начала 3-ий вариант, добавить джойном таблицу comments, а не через подзапрос.
 

JIEXA

Новичок
Gas
Вы имели ввиду LEFT JOIN`ом таблицу comments_full?

И почему IN(SELECT в мускуле зло?
 

zerkms

TDD infected
Команда форума
И почему IN(SELECT в мускуле зло?
потому что mysql не оптимизирует это выражение и выполняет вложенный запрос для каждой выбранной записи.
 

Gas

может по одной?
химичить тут не нужно, у тебя сейчас запрос с 2-мя джойнами и подзапросом, а ты можешь сделать 3-мя джойнами.
 
Сверху