MYSQL FULL JOIN模拟查询,意外结果

时间:2014-09-07 13:01:23

标签: mysql sql join

我有两个表,标记和markerDetails。我想从markerDetails的行追加标记值的行,如果有标记,那么它就是标记详细信息。两者上的常见列是纬度和经度。我已尝试使用UNIONLEFT JOIN RIGHT JOIN的许多不同版本。

这是我现在的查询,简单而且几乎可以运作:

$query = mysqli_query($link, "SELECT * FROM markers as m LEFT JOIN markerDetails as md 
        on m.latitude=md.latitude AND m.longitude=md.longitude WHERE m.whoAdded='$user'");

//tried, same result as above
mysqli_query($link, "SELECT * FROM markers as m LEFT JOIN markerDetails as md on
    m.latitude=md.latitude AND m.longitude=md.longitude WHERE m.whoAdded='$user' UNION SELECT * FROM markers as m 
    RIGHT JOIN markerDetails as md on m.latitude=md.latitude AND m.longitude=md.longitude");

此查询出现问题,如果markerDetails中没有行,由于某种原因它会给我一个NULL id,NULL纬度和NULL经度。如果markerDetails中有一行,我会得到markerDetails行的id,而不是标记行......

理想情况下,我希望标记中的整行具有来自markerDetails的附加行,具有纬度和经度的一个实例......并且仍然使用WHERE m.whoAdded='$user'。我在这里不了解JOIN查询的内容是什么?

markers STRUCTURE:
id  latitude  longitude  whoAdded  locationType  locationName  numChecks numImgs numRevs   timeadded
markerDetails STRUCTURE:
id  latitude  longitude  locAdd  locHrs  locPh  locSt  locApp  locMsg  locMn

所以期望的输出应该是:

id (of markers), latitude, longitude, whoAdded, locationType, locationName, 
numChecks, numImgs, numRevs, locAdd, locHrs, locPh, locSt, locApp, locMsg, locMn

2 个答案:

答案 0 :(得分:1)

尝试:

SELECT m.id,
       m.latitude,
       m.longitude,
       m.whoAdded,
       m.locationType,
       m.locationName,
       m.numChecks,
       m.numImgs,
       m.numRevs,
       md.locAdd,
       md.locHrs,
       md.locPh,
       md.locSt,
       md.locApp,
       md.locMsg,
       md.locMn
  FROM markers as m
  LEFT JOIN markerDetails as md
    on m.latitude = md.latitude
   AND m.longitude = md.longitude
 WHERE m.whoAdded = '$user'

答案 1 :(得分:0)

您需要对两个表进行INNER JOIN。

mysqli_query($link, "SELECT * FROM markers m, markerDetails md where 
    m.latitude=md.latitude AND m.longitude=md.longitude AND m.whoAdded='$user'");

此外,您可以在上面的选择查询中限制所需的列。