Запрос с подзапросом, где результатов может быть много

0

У меня есть главный стол, tbl_vluchtgegevens, который является "главной" таблицей, на которую я смотрю. Из этого я хочу присоединиться к tbl_photos и показать "случайный" результат из этой таблицы.

Моя проблема в том, что в tbl_vluchtgegevens есть только одно значение столбца, которое будет равно значению столбца в tbl_photos, однако есть второй столбец, который хранится в tbl_photos, который похож на второй столбец в tbl_vluchtgevevens, который ему нужно посмотреть. Существует 3-я таблица, где значение в tbl_photos будет иметь значение для tbl_vluchtgegevens, tbl_luchtvaartmaatschappij

Я просто не могу понять код MySQL для MariaDB. Я попытаюсь показать это ниже.

 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
  • 1
    Я думаю, что лучше показывать некоторые примеры данных на sqlfiddle.com и создавать таблицы данных ascii (форматированный текст), какие результаты вы ожидаете ... Обратное проектирование SQL с некоторым текстом в рабочий код SQL практически невозможно сделать ... Голландский lauguage в коде SQL делает его еще сложнее для не говорящих по-голландски людей
  • 0
    Я разобрался с sqlfiddle и вот ссылка sqlfiddle.com/#!9/19e222/1
Показать ещё 2 комментария
Теги:
subquery

1 ответ

0
Лучший ответ

Один из способов сделать это с помощью связанного с подзапросом

запрос

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

  • 0
    Благодарю. Это делает именно то, что я хотел, в точку. Единственное, что он не делает, это допускает наличие нескольких столбцов (которые, как я понимаю, я не указал, и, следовательно, не является вашей ошибкой). Для этого этот тип запроса не работал. но пока это будет работать. В очередной раз благодарим за помощь.
  • 0
    «Единственное, что он не делает, это допускает наличие нескольких столбцов (которые, как я понимаю, я не указал, и, следовательно, не является вашей ошибкой). Для этого этот тип запроса не работал. Но в настоящее время этот будет работать "@ DaniëlCronk Что вы имеете в виду? Может быть, лучше, если вы зададите новый вопрос и, возможно, опубликуете ссылку в этом разделе комментариев, так что я, возможно, смогу помочь вам снова ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню