2012-06-11 61 views
0

我有这个疑问:如何使内部联接此查询

SELECT hit.timestamp,hit.id,config.Name,hit.meter_id,levels.LevelName, pos.sm_pos , hit.hit_value 
FROM pos,hit,controllers,levels,config 
WHERE hit.id=config.id 
AND hit.meter_id=levels.id 
AND pos.id=hit.id 
AND pos.controller_id=controllers.id; 

如何使从这个内部联接查询?用别名什么的?我正在寻找,我无法找到任何多表查询。

+3

了解[SQL连接](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html)。 – eggyal

回答

4

你现在加入表的方式已经过时了。它被用于eartlier,现在我们使用关键字如INNER/NATURAL/LEFT OUTER/RIGHT OUTER/CROSS等根据要求连接表。

Refer Join in Mysql

SELECT hit.timestamp, 
     hit.id, 
     config.Name, 
     hit.meter_id, 
     levels.LevelName, 
     pos.sm_pos, 
     hit.hit_value 
FROM hit 
     INNER JOIN config 
       ON hit.id = config.id 
     INNER JOIN levels 
       ON hit.meter_id = levels.id 
     INNER JOIN POS 
       ON pos.id = hit.id 
     INNER JOIN controllers 
       ON pos.controller_id = controllers.id; 

注意:您发布的查询是根据SQL-89标准,第二是根据SQL-92由我发布。
SQL-92标准介绍INNER JOIN .. ONOUTER JOIN .. ON为了替换SQL-89的更复杂的(?)语法。

+0

还有一个问题。你的代码在mysql中正常工作。但是当我在PHP中尝试它时,我收到一个错误,除第一个列外,每列都有未定义的索引。所以第一个走低谷,其他走向失败。任何想法? –

+0

@denonth,你可以分享PHP代码。 –

+0

我把它贴在了stackoverflow作为问题,所以人们正在努力 –

1

如果你想重新格式化您的查询,你可以做这样的:

SELECT 
    H.timestamp, 
    H.id, 
    F.Name, 
    H.meter_id, 
    L.LevelName, 
    P.sm_pos, 
    H.hit_value 
FROM pos AS P 
INNER JOIN controllers AS C ON P.controller_id = C.id 
INNER JOIN hit AS H ON P.id = H.id 
INNER JOIN levels AS L ON H.meter_id = L.id 
INNER JOIN config AS F ON H.id =F.id; 

请注意,我已经采取了自由添加你的表名的别名,这可以简化很多你的查询。

要了解加入MySQL的工作方式,请阅读它的文档here in the manual。关于连接的一个很好的教程是由Jeff Atwood编写的,你可以找到它here