Справка по оптимизации SQL-запросов - PullRequest
1 голос
/ 26 июля 2011

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

Я хочу получить содержимое и соответствующие категории.

Это слишком упрощенная версия текущего сценария, безпроцедуры проверки ошибок:

$q = "SELECT * FROM contents WHERE contents.foo = 'bar'"
$resource = mysql_query($q);
$categoryFilter = array();

$q2 = "SELECT * FROM categorization WHERE ";
while($content = mysql_fetch_assoc($resource))
{
    $categoryFilter[] = "content_id='" . $content["id"] . "'";
}

if(count($categoryFilter))
{
    $q2 .= implode(" OR ", $categoryFilter);
    mysql_query($q2);
}

В этом суть.Я надеюсь, вы понимаете, что я пытаюсь сделать.Я не знаю, могу ли я на самом деле использовать JOINS, content_id может присутствовать в нескольких строках в categorization.Поэтому я просто добавил несколько OR, пытаясь выбрать элементы один за другим.Я действительно не хотел бы использовать несколько запросов в этом сценарии.Я надеюсь, что кто-нибудь может предложить подход

Спасибо за ваше время

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Достаточно одного запроса для извлечения данных из всех трех таблиц:

SELECT categories.category_id #, other fields
FROM contents
INNER JOIN categorization ON contents.content_id = categorization.content_id
INNER JOIN categories ON categorization.category_id = categories.category_id
WHERE contents.content_id = 1 # AND other filters

Настройте столбцы в предложении SELECT и / или условия в предложении WHERE в соответствии с вашими потребностями.

0 голосов
/ 26 июля 2011

Это должно сделать то же самое, что и в вашем примере:

$q = "
    SELECT *
    FROM
        contents c
        categorization ctg ON ctg.content_id = c.id
    WHERE c.foo = 'bar'
";

$result = mysql_query($q);
0 голосов
/ 26 июля 2011

Если я правильно понимаю, вы можете сделать это одним оператором sql

SELECT *
FROM contents t1 
JOIN categorization t2
WHERE t1.content_id = t2.content_id AND t1.foo = 'bar'

Также убедитесь, что content_id проиндексирован как в «содержимом», так и в «категоризации».Может показаться целесообразным также индексировать 'foo', но это зависит от того, как вы на самом деле ищете.

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