2010-09-19 6 views
0

Рассмотрим этот вопрос:Упрощение запроса?

SELECT table1.id, 
     table1.review, 
     table1.time, 
     table2.author, 
     table2.title 
FROM 
table1, table2 
WHERE table1.id = table2.id 
AND table1.reviewer = '{$username}' 
ORDER BY table1.id 

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

Есть ли способ сделать вышеуказанный запрос проще/проще?

ответ

5

Прежде всего, вы можете дать более короткие псевдонимы для таблиц. Кроме того, вы используете синтаксис неявного соединения, который усложняет предложение WHERE и не рекомендуется вообще. Вы можете использовать более современный явный синтаксис вместо:

SELECT t1.id, t1.review, t1.time, t2.author, t2.title 
FROM  table1 AS t1 
JOIN  table2 AS t2 ON (t2.id = t1.id) 
WHERE  t1.reviewer = '{$username}' 
ORDER BY t1.id 

Обратите внимание, что JOIN является синонимом INNER JOIN и AS необязательное ключевое слово при определении псевдонимов таблиц. Вы можете просто использовать ... FROM table1 t1 ... вместо ... FROM table1 AS t1 ....

+0

OP размещен синтаксис ANSI-89; ваш ANSI-92. Но нет разницы в производительности. –

+0

Согласовано. Нет разницы в производительности, но упрощает предложение 'WHERE'. –

+0

Я согласен с тем, что все запросы для всех будут использоваться для 92 более 89. –

0

Ваш запрос выглядит довольно оптимальным, помимо потенциальных рисков, с помощью части «{$ username}». Я мог бы легко увидеть некоторые проблемы с внедрением SQL, если общий запрос обрабатывается как прямая строка, а не через абстрактный слой какого-то рода.

+1

$ имя пользователя уже дезинфицировано с помощью проверки, а затем пробегает mysql_real_escape_string – Newbtophp

+0

Отлично. Приятно слышать. – allnightgrocery

1

Вы можете использовать псевдонимы таблиц

SELECT t1.id, t1.review, t1.time, t2.author, t2.title 
FROM 
table1 AS t1, table2 AS t2 
WHERE t1.id = t2.id AND t1.reviewer = '{$username}' 
ORDER BY t1.id 
0

Формата Я нахожу наиболее читаемым является:

SELECT 
    t1.id, 
    t1.review, 
    t1.time, 
    t2.author, 
    t2.title 
FROM 
    table1 t1 

    JOIN table2 t2 
     on (t2.id = t1.id) 

WHERE 
    t1.reviewer = '{$username}' 

ORDER BY 
    t1.id 
+0

Каждый из них, я полагаю: 3 слишком много пустых строк, и слишком много вещей распространяется по нескольким линиям, где одного достаточно для моего вкуса (на менее четырех строк, которые не появятся в моем SQL). Я полагаю, что «on» вместо «ON» - это опечатка? И я бы использовал явное ключевое слово AS для обозначения псевдонимов таблицы. AFAIAC, показанный запрос выглядит больше и сложнее, чем простой запрос, на самом деле это - и разница в макете. –

+0

Это менее очевидно с небольшим запросом, подобным этому, но когда вы получаете до 60 + полей в 10+ таблицах с более сложными предложениями JOIN и несколькими условиями, лишнее свободное пространство действительно помогает сделать его менее устрашающим и более читаемым. –

1

Почему бы вам не сделать функцию передать имя таблицы и другие параметры и возврат значений или SQL-запрос.

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

У меня была аналогичная проблема, с которой я избавился от использования функции.

+0

Пример был бы замечательным :) – Newbtophp

+0

+1 только за идею рефакторинга. Копирование/вставка кода повсюду - просто gauche. –

+0

Передача имени таблицы в виде переменной обеспечивает использование динамического SQL. –

0

Непонятно, если вы используете стенографический код выше по всему сайту или стиль SQL без псевдонимов.

Если этот конкретный фрагмент кода копируется/вставлен, рассмотрите возможность инкапсуляции этой логики в функцию в ваших PHP-модулях.

function GetReviewerTitles($reviewer) 
{ 
    //your select statement. 
    $reviewerSQL = sprintf("SELECT t1.id, t1.review, t1.time, t2.author, t2.title FROM table1 as t1 INNER JOIN table2 AS t2 ON t1.id=t2.id WHERE t1.reviewer = '%s' ORDER BY t1.id", 
        mysql_real_escape_string({$username})); 

    // Perform Query 
    $result = mysql_query($reviewerSQL); 

    //return if/when necessary 
} 
+0

Я использую стиль SQL без псевдонимов вокруг сайта, также обратите внимание; $ username не может анализироваться в одинарных кавычках (в вызове функции mysql_real_escape_string) – Newbtophp

0

Я предлагаю использовать вид:

CREATE VIEW ReviewInfo(id, review, time, author, title, reviewer) AS 
    SELECT t1.id,  t1.review, t1.time, 
      t2.author, t2.title, t1.reviewer 
     FROM table1 AS t1 JOIN table2 AS t2 ON t1.id = t2.id 

Теперь вы можете написать свой запрос как:

SELECT id, review, time, author, title 
    FROM ReviewInfo 
WHERE reviewer = '{$username}' 
ORDER BY id; 

Обратите внимание на использование сокращений для имен таблиц в определении представления - что это метод, который вы могли бы использовать в своем запросе, даже если вы не используете представление. И обозначения с использованием явного оператора JOIN в предложении FROM с условием ON предпочтительны для старого стиля FROM table1, table2.

Смежные вопросы