1

将 LEFT JOIN 和 INNER JOIN 组合添加到现有查询时遇到问题。

我有两张主桌;“photoSearch”包含我的照片的所有可搜索数据,“photos”包含我的照片的所有数据。我在“photoSearch”中的 3 个字段中使用 FULLTEXT 来获取相关的 photoID,然后从“照片”表中获取数据,如版权、尺寸、尺寸......

这是我的查询:

SELECT p.photoID, p.setID, p.headline, p.caption, p.height, p.width, p.size, p.copyright
FROM photos AS p,
      (SELECT photoID FROM photoSearch WHERE MATCH (allPeople, allKeywords, shortCaption)
      AGAINST ('+byline' IN BOOLEAN MODE) LIMIT 0,50) AS photoIDs
WHERE p.photoID = photoIDs.photoID;

我现在需要修改这个查询以包含一个 LEFT JOIN 和一个 INNER JOIN,它可以获取每张照片中显示的任何人的姓名,以便在屏幕上打印。有些照片没有任何人,因此需要 LEFT JOIN。我在两个表中有这些数据(标准化);“photoPeople”和“people”,所以我想出了这个加入:

我的加入(需要添加到上述查询)

LEFT JOIN ( photoPeople AS pp INNER JOIN people AS pe ON pp.peopleID = pe.PeopleID)
ON p.photoID = pp.photoID

但是我发现很难将其放入我的原始查询中,因为子选择查询位于逗号分隔的 FROM 列表中 - 这让我感到困惑。我还想通过加入我不应该加入的地方来确保不会影响 FULLTEXT 索引的性能。

我确实尝试在子选择之后(在 WHERE 之前)直接添加它,但我收到 SQL 错误,说它无法识别列 p.photoID。

原始查询和数据库设计都不是我的。

任何帮助或指导将不胜感激。

4

2 回答 2

4
SELECT 
    p.photoID, 
    p.setID, 
    p.headline, 
    p.caption, 
    p.height, 
    p.width, 
    p.size, 
    p.copyright,
    pe.*
FROM 
    photos p
INNER JOIN
    (
        SELECT photoID 
        FROM photoSearch 
        WHERE MATCH (allPeople, allKeywords, shortCaption) AGAINST ('+byline' IN BOOLEAN MODE) 
        LIMIT 50
    ) pids ON p.photoID = pids.photoID
LEFT JOIN
    photoPeople pp ON p.photoID = pp.photoID
LEFT JOIN
    people pe ON pp.peopleID = pe.peopleID

我认为不需要INNER JOINpeople桌子上,LEFT JOIN因为如果LEFT JOINNULLpeople也将是NULL

于 2012-07-09T01:17:36.113 回答
0
LEFT JOIN 
  ( SELECT pp.photoID,name FROM photoPeople AS pp INNER JOIN people AS pe 
    ON pp.peopleID = pe.PeopleID) aa
ON p.photoID = aa.photoID
于 2012-07-09T01:11:59.160 回答