2011-01-09 2 views
0

Я надеюсь на некоторую помощь, чтобы сделать мои запросы более эффективными, если это возможно. У меня две таблицы. Один из них содержит доступные типы контента и другой, который содержит контент, связанный с таблицей типов идентификатором типа.Можно ли использовать один запрос mysql для достижения этого?

Я пытаюсь выбрать из таблицы содержимого и сгруппировать результаты по типу_ид. В настоящее время я использую запрос внутри цикла для этого, чтобы он снова выбирал из второй таблицы для каждого типа_ид. Есть ли лучший/более эффективный способ сделать это?

Вот мои текущие таблицы и запросы:

type_id  type 
    1  type 1 
    2  type 2 

id title type_id content 
1  test1 1  test content 1 
2  test2 2  test content 2 
3  test3 1  test content 3 



$query="select type_id, type from type_table"; 

foreach($query as $type){ 

$query="select title, content from content_table WHERE type_id=$type['type_id']"; 
} 

Я надеюсь, что это имеет смысл.

Спасибо

+0

Я думаю, что очень важно знать, как вам нужно обрабатывать результаты каждого запроса type_id, чтобы получить хорошие ответы. –

ответ

1

Вашего примера, как представляется, выберите всех возможных значения из таблицы содержания, хотя и в пакетах данного типа в то время. Таким образом, select title, content from content_table наверняка выполнит все это за один раз, без зацикливания.

Чтобы поместить каждый TYPE_ID в новый DIV, вы могли бы сделать что-то вроде этого:

SELECT title, content, t.type_id, t.type 
FROM content_table c 
JOIN type_table t ON t.type_id = c.type_id 
ORDER BY t.type_id 

// pseudo-code 
prev_type_id = -1 
print "<div>" 
foreach row: 
    if type_id != prev_type_id: 
     prev_type_id = type_id 
     print "</div><div>" 
print "</div>" 

(отредактированные на основе комментариев)

+0

За исключением того, что а) его партии отсортированы, а ваш запрос отсутствует, и внутри цикла он имеет информацию о текущем типе (потому что он просил об этом), чего нет в данных, возвращаемых из вашего запроса. – etarion

+0

Привет, спасибо за ответ. Я не уверен, что правильно объяснил .... Причина, по которой я использовал foreach с первой таблицей, состоит в том, что результаты второго запроса будут отображаться в отдельных div, созданных циклом. Таким образом, каждая строка содержимого будет сгруппирована по типу type_id и отображена в div со всеми остальными рядами того же типа –

+0

. @Etarion хорошо, не полностью «отсортирован», но не полностью перемешан как мой. Но мы ничего не знаем о том, что происходит внутри цикла foreach; для всех, кого мы знаем, это могла быть попытка предыдущего разработчика подражать JOIN за то, что он не знал лучшего способа ... (теперь отредактировал мой ответ, чтобы принять это во внимание) –

0

Используйте соединение и заказ. Нечто подобное (без гарантии для синтаксической правильности):

SELECT 
    c.title, c.content, t.type_id, t.type 
FROM 
    type_table t, content_table c 
WHERE 
    c.type_id = t.type_id 
ORDER BY 
    t.type_id 
+0

Привет, спасибо за ответ. Я не уверен, что правильно объяснил .... Причина, по которой я использовал foreach с первой таблицей, состоит в том, что результаты второго запроса будут отображаться в отдельных div, созданных циклом. Таким образом, каждая строка содержимого будет сгруппирована по типу type_id и отображена в div со всеми остальными рядами того же типа –

+0

@Paul, вы можете сделать это с помощью этого ответа, если вы с удовольствием сделаете дополнительную бухгалтерию - например, отслеживание предыдущий тип_ид и выдает новый div всякий раз, когда он изменяется. Должно быть быстрее, чем запускать множество запросов, но требует немного дополнительного кодирования. –

0

Конечно, вы могли бы объединить эти две таблицы.

В этом примере, однако, не представляется, что вам даже нужно использовать type_table. Вы можете просто отсортировать запрос по типу_ид:

select title, content from content_table order by type_id; 
+0

Привет, спасибо за ответ. Я не уверен, что правильно объяснил .... Причина, по которой я использовал foreach с первой таблицей, состоит в том, что результаты второго запроса будут отображаться в отдельных div, созданных циклом. Итак, каждая строка содержимого будет сгруппирована по типу type_id и отображена в div со всеми остальными строками того же типа –

0

Каков ожидаемый результат?

Это то, что я думаю, что вы хотите.

$sql = 'SELECT t.type, c.title, c.content 
     FROM `content_table` c 
     INNER JOIN `type_table` t ON c.type_id = t.type_id 
     ORDER BY c.type_id ASC' 

// Dont use a foreach-loop to loop over the results. While-loop is ideal 
while ($row = <query or fetch from resultset here>) { 
.. 
}