Рассмотрим этот запрос:
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
Я использую вышеупомянутое довольно много вокруг кода моего сайта. Я считаю, что добавление префиксов таблиц и т.д. До того, как имена столбцов могут сделать запрос очень длинным и заняться довольно большим количеством строк.
Есть ли способ упростить/упростить приведенный выше запрос?
Прежде всего, вы можете использовать более короткие псевдонимы для своих таблиц. Кроме того, вы используете синтаксис неявного соединения, который усложняет предложение 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 ...
.
Вы можете использовать псевдонимы таблиц
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
Почему вы не выполняете функцию, передаете имя таблицы и другие параметры и возвращаете либо значения, либо sql-запрос.
Ваш запрос уже упрощен, я думаю, что вы беспокоитесь об этом несколько раз. поэтому лучше будет создать небольшую функцию в этом случае.
У меня была схожая проблема, с которой я избавился от функции.
Вы запрашиваете внешний вид довольно оптимально, помимо потенциальных рисков, с помощью части "{username}". Я мог бы легко увидеть некоторые проблемы с внедрением SQL, если общий запрос обрабатывается как прямая строка, а не через абстрактный слой какого-то рода.
Я предлагаю использовать представление:
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
.
Неясно, используете ли вы "код выше по всему сайту" дословно, или стиль 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
}
Формат, который я считаю наиболее читаемым, это:
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
WHERE
.