mysql - 使用结果可能很多的子查询进行查询
问题描述
我有一个主表 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
解决方案
一种方法是使用共同相关的子查询
询问
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 |
推荐阅读
- shell - shell中的Unix变量赋值
- powershell - Powershell - 替换函数写入输出
- javascript - React 原生全局值重新渲染
- python - 将 python 应用程序部署到登台和生产
- sql - 如何在postgresql的选择查询中将表的列字段值中的字符串拆分为多行
- authentication - Yii2 RBAC failure - it either blocks everything or guest is allowed everything as well
- php - 在 laravel 中如何创建唯一和随机数
- django - Passing kwargs to parent class from inheritance relationship in child class
- firebase - Error while Inserting data into cloud firestore flutter?
- javascript - 400 Bad Request to GraphQL endpoint(我的测试查询有什么问题?)