简化此查询?

时间:2010-09-19 00:52:53

标签: php mysql join

考虑这个问题:

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

我在网站的代码周围使用了相当多的内容。我发现在列名之前添加表前缀等可以使查询非常长并占用很多行。

有没有办法让上述查询更简单/更容易?

7 个答案:

答案 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

请注意,JOININNER 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