【问题标题】:MySQL - Adding a JOIN to existing queryMySQL - 向现有查询添加 JOIN
【发布时间】:2012-07-09 09:29:49
【问题描述】:

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

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

如有任何帮助或指导,我们将不胜感激。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    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 JOINLEFT JOIN 上的people 表,因为如果LEFT JOINNULL,那么people 也将是NULL

    【讨论】:

    • 嘿,谢谢哥们。它确实抛出了一个小错误; “每个派生表都必须有自己的别名”。别名需要去哪里的任何想法?
    • @PaparazzoKid,我在发布后立即纠正了这个错误,现在尝试查询。
    • 我刚刚尝试了更新版本,仍然抛出同样的错误。我无法解决这个问题,我认为派生表的别名是“pids”?
    • @PaparazzoKid,哎呀!我没有看到LIMIT 50 一直到右边。现在它应该希望工作。 =D
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多