MYSQL 帮助 - 2 个数据库,1 个特色图片

MYSQL Help - 2 Databases, 1 Featured Image

我目前有 2 个 MYSQL 数据库。

DatabaseOne 是包含所有汽车的完整数据库,DatabaseTwo 侧重于汽车制造商的具体细节。例如:

DatabaseOne 有汽车制造商、型号、年份、颜色和 link 到汽车图片

DatabaseTwo 有制造商、制造商的详细信息、phone 编号、网站等,以及我可以设置的 featured_image_id突出显示 DatabaseOne 中的特定汽车,加入匹配 ID。

Table 数据数据库一:

    ID   |   Manufacturer   |   Model   |   Year   |   Color   |   ImageLink
    1    |   Toyota         |   Camry   |   2002   |   Black   |   88.jpg
    2    |   Toyota         |   Venza   |   2010   |   Black   |   91.jpg
    3    |   Mazda          |   Miata   |   2001   |   Red     |   77.jpg
    4    |   Mercedes       |   Benz    |   2012   |   Green   |   46.jpg
    5    |   Mercedes       |   Benz    |   2000   |   Blue    |   12.jpg

Table 数据数据库二:

    ID   |   Manufacturer   |   PhNumber   |   Website   |   FeaturedImage
    1    |   Toyota         |   555-5555   |   .com      |        2
    2    |   Mazda          |   555-5555   |   .com      |        3
    3    |   Mercedes       |   555-5555   |   .com      |        

当 DatabaseTwo 中的 FeaturedImage 与 DatabaseOne 的 ID 匹配时,数据库加入。

在这种情况下,Toyota 将显示 DatabaseOne ID 2 (Venza) 的 ImageLink (.jpg),Mazda 将显示 DatabaseOne ID 3 的 Mazda 图像,并且由于未设置 Mercedes FeaturedImage,我想要它显示最新的梅赛德斯,这将是 DatabaseOne ID 5。

我想做的是显示结果,按 DatabaseTwo 中的制造商分类,如果在 DatabaseTwo 中设置了 featured_image_ID,我想显示 image_link 来自中的匹配 ID DatabaseOne,如果没有设置featured_image_id,我只想显示该制造商最近的汽车的image_link。

显示结果时,当下面语句中第二个CASE前面有"OR"时,所有recent图像的汽车显示,然而 设置了 featured_image_id 的制造商也将只显示最近关联的 image_link。

当第二个 CASE 前面有 "AND" 时,ONLY 设置 featured_image_id 的制造商将出现,none 其他没有 featured_image_id 的制造商出现。

我试图确保所有制造商都显示图像,无论是在 DatabaseTwo.featured_image_id 中明确设置,还是如果未设置,则回退到匹配制造商的最新图像 ID。

这是我当前的 MYSQL 代码:

    SELECT DatabaseOne.id, DatabaseOne.manufacturer, 
    DatabaseOne.model,DatabaseOne.year, DatabaseOne.picture, 
    DatabaseOne.image_link, DatabaseTwo.featured_image_id, 
    DatabaseTwo.title, DatabaseTwo.id, 
    IF(DatabaseTwo.id != 0, DatabaseTwo.id, 'N/A') AS card_id 
    FROM DatabaseOne 
    LEFT JOIN DatabaseTwo
    ON (CASE 
    WHEN (DatabaseTwo.featured_image_id != 0 AND DatabaseTwo.category = 'Manufacturer' 
    AND DatabaseTwo.Manufacturer = DatabaseOne.Manufacturer) 
    THEN (DatabaseTwo.featured_image_id = DatabaseOne.id) 
    END ) 
    WHERE DatabaseOne.Manufacturer != ''  
    AND DatabaseOne.id != 0 
    OR ((CASE 
    WHEN (DatabaseTwo.featured_image_id IS NOT NULL) 
    THEN (DatabaseTwo.featured_image_id != 0 ) END) ) 
    GROUP BY DatabaseOne.Manufacturer
    ORDER BY DatabaseOne.Manufacturer ASC, DatabaseOne.id DESC 

请尝试以下查询:

SELECT t1.ID, t1.Manufacturer, t1.Model, t1.Year, t1.Color,
    t3.ImageLink
FROM DatabaseOne t1 LEFT JOIN
(
    SELECT db2.Manufacturer,
        COALESCE(db2.FeaturedImage, t.DefaultFeaturedImage) AS FeaturedImage
    FROM DatabaseTwo db2
    INNER JOIN
    (
        SELECT MAX(ID) AS DefaultFeaturedImage, Manufacturer
        FROM DatabaseOne
        GROUP BY Manufacturer
    ) t
        ON db2.Manufacturer = t.Manufacturer
) t2
    ON t1.Manufacturer = t2.Manufacturer
INNER JOIN DatabaseOne t3
    ON t2.FeaturedImage = t3.ID

按照下面的 link 进行 运行 演示:

SQLFiddle