考虑这个问题:
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
我在网站的代码周围使用了相当多的内容。我发现在列名之前添加表前缀等可以使查询非常长并占用很多行。
有没有办法让上述查询更简单/更容易?
答案 0 :(得分: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 ...
。
答案 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
答案 2 :(得分:1)
为什么不创建函数,传递表名和其他参数并返回值或sql查询。
您的查询已经简化,我认为您担心多次这样做。因此,在这种情况下创建一个小函数会更好。
我有类似的问题,我使用函数摆脱了。
答案 3 :(得分:0)
除了“{$ username}”部分的潜在风险之外,您的查询看起来非常理想。如果将整个查询呈现为直接字符串而不是通过某种抽象层,我可以很容易地看到一些SQL注入问题。
答案 4 :(得分: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
答案 5 :(得分: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
}
答案 6 :(得分: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;
请注意在视图定义中使用表名的缩写 - 即使您不使用视图,也可以在查询中使用这种技术。使用带有ON条件的FROM子句中的显式JOIN运算符的符号优先于旧式FROM table1, table2
。