Упрощение этого запроса?

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

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

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

Теги:
join

7 ответов

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
    ОП опубликовал синтаксис ANSI-89; у тебя ANSI-92. Но нет разницы в производительности.
  • 0
    Согласовано. Нет разницы в производительности, но упрощает WHERE .
Показать ещё 1 комментарий
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
1

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

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

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

  • 0
    Пример был бы великолепен :)
  • 0
    +1 только за идею рефакторинга. Копировать / вставлять код повсюду - это просто неряшливо.
Показать ещё 1 комментарий
0

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

  • 1
    $ username уже очищен с помощью проверки, затем прошел через mysql_real_escape_string
  • 0
    Отлично. Приятно слышать.
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.

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)
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). Я полагаю, «ВКЛ» вместо «ВКЛ» является опечаткой? И я бы использовал явное ключевое слово AS для обозначения псевдонимов таблицы. AFAIAC, показанный запрос выглядит больше и сложнее, чем простой запрос, и на самом деле разница в макете.
  • 0
    Это менее очевидно для такого маленького запроса, как этот, но когда вы получаете до 60+ полей в 10+ таблицах с более сложными предложениями JOIN и несколькими условиями, дополнительный пробел действительно помогает сделать его менее пугающим и более читабельным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню