2012-07-09 54 views
1

将添加内部联接的INNER JOIN添加到现有查询时遇到问题。MySQL - 将JOIN添加到现有查询中

我有两个主表;包含我的照片的所有可搜索数据的“photoSearch”和包含我的照片的所有数据的“照片”。我使用FULLTEXT在3个领域中的“照片搜索”,以获得有关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”和“人”,所以我想出了这个连接:

我加入(这需要将上面的查询)

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

我没有看到在LEFT JOIN需要INNER JOINpeople表,因为如果LEFT JOINNULL,该people也将是NULL

+0

嘿,谢谢哥们。它确实引发了一个小小的错误; “每个派生表都必须有自己的别名”。任何想法的别名需要去? – TheCarver 2012-07-09 01:24:29

+0

@PaparazzoKid,我在发布后立即纠正了错误,现在尝试查询。 – 2012-07-09 01:25:46

+0

我刚试过更新后的版本,仍然抛出相同的错误。我无法解决这个问题,我认为派生表有一个“pids”的别名? – TheCarver 2012-07-09 01:27:39

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 
+0

这并不能帮助我,对不起。 – TheCarver 2012-07-09 01:16:44