MYSQL多个INNER JOIN检索每个信息

时间:2014-07-02 14:05:56

标签: mysql join left-join

我想在我的脚本中运行以下查询但它无法正常工作。 我没有收到任何错误,它只是从hs_data中选择正确的数据(以及所有内容)但是从hs_download_links中它只检索了与hs.images中的条目一样多的数据。

此查询的目标应该是从hs_data获取任何条目。如果在hs_download_links或hs_images中有与这些条目相关的信息,它也应该得到它们。

                    SELECT
                        h.hacks_ID, h.hacks_Name, h.hacks_Name_Full, 
                    h.hacks_Version, h.hacks_Description, h.hacks_AddDate,
                     h.hacks_Type, SUM(dl.link_count) AS link_count, i.image_NameThumb
                    FROM
                        hs_data h
                    LEFT JOIN
                        (hs_download_links dl CROSS JOIN hs_images i)
                    ON 
                        ((dl.link_hackID = h.hacks_ID AND i.image_HackID = h.hacks_ID)
                    OR 
                    (dl.link_hackID = h.hacks_ID AND i.image_HackID is NULL) 
                    OR
                    (dl.link_hackID is NULL AND i.image_HackID = h.hacks_ID)
                    OR 
                    (dl.link_hackID is NULL AND i.image_HackID is NULL) )
                    GROUP BY 
                        h.hacks_ID
                    ORDER BY link_count DESC

如果你们能帮助我,那会很棒,非常感谢:)。

2 个答案:

答案 0 :(得分:0)

我认为你可以写成:

SELECT h.hacks_ID, h.hacks_Name, h.hacks_Name_Full, 
       h.hacks_Version, h.hacks_Description, h.hacks_AddDate,
       h.hacks_Type, SUM(dl.link_count) AS link_count, i.image_NameThumb
FROM hs_data h LEFT JOIN
     hs_download_links dl
     on dl.link_hackID = h.hacks_ID LEFT JOIN
     hs_images i
     on i.image_HackID = h.hacks_ID
GROUP BY h.hacks_ID
ORDER BY link_count DESC;

我不确定你要用cross join完成什么,但似乎不必要地混淆了。您可以将left outer join链接在一起。他们仍然将所有行保留在第一个表中。

顺便说一下,你的选择有一个悬空i.image_NameThumb。这意味着只会出现一个这样的值。如果有多个值,您可能需要使用group_concat()。或者甚至min()max()只是为了澄清查询的意图。

答案 1 :(得分:0)

这将返回hs_data中每条记录的下载链接数和第一张图像(如果有):

SELECT  d.*,
        (
        SELECT  COUNT(*)
        FROM    hs_download_links dl
        WHERE   dl.link_hackId = d.hacks_Id
        ),
        (
        SELECT  i.image_NameThumb
        FROM    hs_images i
        WHERE   i.image_hackId = d.hacks_Id
        ORDER BY
                image_NameThumb
        LIMIT 1
        )
FROM    hs_data d