首页 > 解决方案 > 使用结果可能很多的子查询进行查询

问题描述

我有一个主表 tbl_vluchtgegevens,这是我正在查看的“主”表。由此,我想加入 tbl_photos 并显示该表的“随机”结果。

我的问题是,在 tbl_vluchtgegevens 中只有 1 个列值等于 tbl_photos 中的列值,但是,在 tbl_photos 中存储的第二列类似于 tbl_vluchtgevevens 中需要查看的第二列。在第三张表中,tbl_photos 中的值将具有 tbl_vluchtgegevens、tbl_luchtvaartmaatschappij 的值

我只是无法弄清楚 MariaDB 的 MySQL 代码。我将尝试在下面显示。

 tbl_vluchtgegevens     |     tbl_luchtvaartmaatschappij     |    tbl_photos
 luchtvaartmaatschappij       luchtvaartmaatschappij
                              IATACode                             img_lvm
 inschrijvingnmr                                                   img_nmr

样本数据:

 tbl_vluchtgegevens
 gegevenID  |  luchtvaartmaatschappij  |  inschrijvingnmr  |  vertrekdatum2
 1             911                        N803NW              2018-01-01 12:00:00
 2             1702                       PH-AON              2018-01-15 17:00:00
 3             911                        N853NW              2018-01-17 11:00:00


 tbl_luchtvaartmaatschappij
 luchtvaartmaatschappijID   |   IATACode
 911                            DL
 1702                           KL
 1803                           LH


 tbl_photos
 photoID   |   img_lvm   |   img_nmr   |   file
 1              DL            N853NW       somefile.jpg
 2              DL            N803NW       somefile2.jpg
 3              DL            N853NW       somefile3.jpg
 4              KL            PH-AON       somefile4.jpg
 5              KL            PH-AON       somefile5.jpg
 6              LH            D-AUBC       somefile6.jpg
 7              DL            N805NW       somefile7.jpg

查询将导致:

 gegevenID  |  vertrekdatum2        |   luchtvaartmaatschappij  |  inschrijvingnmr  |  file
 1             2018-01-15 12:00:00       911                         N803NW             somefile.jpg
 2             2018-01-15 17:00:00       1702                        PH-AON             somefile4.jpg
 3             2018-01-17 11:00:00       911                         N853NW             somefile3.jpg

sqlfiddle:http ://www.sqlfiddle.com/#!9/19e222/1

有一次,我尝试使用下面的代码,但如果 tbl_photos 中存在多行,则它会显示 tbl_vluchtgegevens 中的每一行以及 tbl_photos 中的所有行。

SELECT DISTINCT vg.gegevenID, vg.vertrekdatum2, vg.inschrijvingnmr, lvm.luchtvaartmaatschappij, lvm.luchtvaartmaatschappijID, p.*

FROM tbl_vluchtgegevens vg

LEFT JOIN tbl_luchtvaartmaatschappij lvm
ON vg.luchtvaartmaatschappij = lvm.luchtvaartmaatschappijID

LEFT JOIN tbl_photos p 
ON lvm.IATACode = p.img_lvm
AND vg.inschrijvingnmr = p.img_nmr 

WHERE vg.vertrekdatum2 <=NOW() 
ORDER BY vg.vertrekdatum2 DESC

我也尝试过做一个子查询,但我只做了一个,无论我如何重新编写代码,我都无法让它工作。

SELECT vg.gegevenID, vg.vertrekdatum2, vg.inschrijvingnmr, lvm.luchtvaartmaatschappij, lvm.luchtvaartmaatschappijID, p.*

FROM tbl_vluchtgegevens vg

LEFT JOIN tbl_luchtvaartmaatschappij lvm
ON vg.luchtvaartmaatschappij = lvm.luchtvaartmaatschappijID

(   SELECT p.*, lvm.IATACode, lvm.luchtvaartmaatschappijID
    FROM tbl_photos p 

    LEFT JOIN tbl_luchtvaartmaatschappij lvm
    ON vg.luchtvaartmaatschappij = lvm.luchtvaartmaatschappijID

    ORDER BY RAND()
    LIMIT 1 ) pho

WHERE vg.vertrekdatum2 <=NOW() AND vg.luchtvaartmaatschappij = pho.luchtvaartnamatschappij AND vg.inschrijvingnmr = pho.img_nmr
ORDER BY vg.vertrekdatum2 DESC

标签: mysqlsubquery

解决方案


一种方法是使用共同相关的子查询

询问

SELECT 
   tbl_vluchtgegevens.gegevenID
 , tbl_vluchtgegevens.vertrekdatum2
 , tbl_vluchtgegevens.luchtvaartmaatschappij
 , tbl_vluchtgegevens.inschrijvingnmr
 , (
     SELECT 
       tbl_photos.file
     FROM 
       tbl_photos
     WHERE
       tbl_photos.img_nmr = tbl_vluchtgegevens.inschrijvingnmr
     ORDER BY 
      RAND()
     LIMIT 1
    ) AS `file`
FROM 
 tbl_vluchtgegevens

WHERE
 tbl_vluchtgegevens.vertrekdatum2 <=NOW() 
ORDER BY
 tbl_vluchtgegevens.vertrekdatum2 DESC

一种可能的结果

| gegevenID |        vertrekdatum2 | luchtvaartmaatschappij | inschrijvingnmr |          file |
|-----------|----------------------|------------------------|-----------------|---------------|
|         2 | 2018-01-01T17:00:00Z |                   1702 |          PH-AON | somefile5.jpg |
|         1 | 2018-01-01T12:00:00Z |                    911 |          N803NW | somefile2.jpg |
|         4 | 2017-03-01T17:00:00Z |                    911 |          N809NW |        (null) |
|         3 | 2017-01-17T11:00:00Z |                    911 |          N853NW | somefile7.jpg |
|         4 | 2016-03-01T17:00:00Z |                   1702 |          PH-AON | somefile3.jpg |

见演示http://www.sqlfiddle.com/#!9/be9f7/29


推荐阅读