質問
ようにしているラバー-
SELECT
Destaque.destaque, Noticia.id, Noticia.antetitulo,
Noticia.titulo, Noticia.lead, Noticia.legenda,
Noticia.publicacao, Seccao.descricao, Album.pasta,
Foto.ficheiro, Foto.descricao, Cronista.nome,
Cronista.profissao, Cronista.ficheiro,
AudioFile.*, AudioCollection.*, VideoFile.*, VideoCollection.*
FROM
nt_highlights AS Destaque
LEFT JOIN nt_noticias AS Noticia ON Destaque.noticia_id = Noticia.id
LEFT JOIN mm_fotos AS Foto ON Noticia.foto_id = Foto.id
LEFT JOIN nt_temas AS Seccao ON Noticia.tema_id = Seccao.id
LEFT JOIN mm_albuns AS Album ON Foto.album_id = Album.id
LEFT JOIN nt_cronistas AS Cronista ON Cronista.id = Noticia.cronista_id
LEFT JOIN ntNoticias_mmFiles AS Rel ON Rel.noticia_id = Noticia.id
LEFT JOIN mm_files AS AudioFile ON AudioFile.id = Rel.file_id
LEFT JOIN mm_coleccoes AS AudioCollection ON AudioFile.coleccao_id = AudioCollection.id
LEFT JOIN mm_files AS VideoFile ON VideoFile.id = Rel.file_id
LEFT JOIN mm_coleccoes AS VideoCollection ON VideoFile.coleccao_id = VideoCollection.id
WHERE
Destaque.area_id = 1
AND Noticia.paraPublicacao = 1
AND Noticia.publicacao <= NOW()
AND (AudioFile.mimeType != '' OR AudioFile.id IS NULL)
AND (VideoFile.mimeType = '' OR VideoFile.id IS NULL)
ORDER BY
Destaque.destaque
このままだに多数の論文から nt_noticias
の考え方を同時に Video
や Audio
ファイルから mm_files
表に示す。
そこで起こることは、いただいた場合、記事の音響、映像、MySQLに戻4行
- の映像がnullの場合)
- 動画を発見しトイレさんに動画には音がnullの場合)
- すべてnull
- を音と映像
たいのですが"力"で戻っ行条の任意の既存のビデオとオーディオ関連?なぜですか。
解決
私はがは、あなたがこのような何かをしたいと考えます:
SELECT
Destaque.destaque, Noticia.id, Noticia.antetitulo,
Noticia.titulo, Noticia.lead, Noticia.legenda,
Noticia.publicacao, Seccao.descricao, Album.pasta,
Foto.ficheiro, Foto.descricao, Cronista.nome,
Cronista.profissao, Cronista.ficheiro,
AudioFile.*, AudioCollection.*, VideoFile.*, VideoCollection.*
FROM
nt_highlights AS Destaque
LEFT JOIN nt_noticias AS Noticia ON Destaque.noticia_id = Noticia.id
LEFT JOIN mm_fotos AS Foto ON Noticia.foto_id = Foto.id
LEFT JOIN nt_temas AS Seccao ON Noticia.tema_id = Seccao.id
LEFT JOIN mm_albuns AS Album ON Foto.album_id = Album.id
LEFT JOIN nt_cronistas AS Cronista ON Cronista.id = Noticia.cronista_id
LEFT JOIN ntNoticias_mmFiles AS AudioRel ON Rel.noticia_id = Noticia.id
AND AudioRel.file_id IN (
SELECT file_id
FROM ntNoticias_mmFiles
WHERE noticia_id = Noticia.id AND IsAudioFile = 1 /* whatever the check is */
LIMIT 1
)
LEFT JOIN mm_files AS AudioFile ON AudioFile.id = Rel.file_id
LEFT JOIN mm_coleccoes AS AudioCollection ON AudioFile.coleccao_id = AudioCollection.id
LEFT JOIN ntNoticias_mmFiles AS VideoRel ON VideoRel.noticia_id = Noticia.id
AND VideoRel.file_id IN (
SELECT file_id
FROM ntNoticias_mmFiles
WHERE noticia_id = Noticia.id AND IsVideoFile = 1 /* whatever the check is */
LIMIT 1
)
LEFT JOIN mm_files AS VideoFile ON VideoFile.id = Rel.file_id
AND VideoFile.IsVideoFile = 1
LEFT JOIN mm_coleccoes AS VideoCollection ON VideoFile.coleccao_id = VideoCollection.id
WHERE
Destaque.area_id = 1
AND Noticia.paraPublicacao = 1
AND Noticia.publicacao <= NOW()
ORDER BY
Destaque.destaque
私の考えは、このました
あなたは、最大で1つのオーディオファイルと一つのビデオファイルを、したいです。そこNoticia
ごとに利用可能ないくつかのファイルがあるので、あなたは、タイプごとに1つのファイルの最大参加に入ったことを確認する必要があります。これはまた、あなたが二回ntNoticias_mmFiles
テーブルに参加しなければならないことを意味 - 。タイプごとに一度
これは、結合条件でサブクエリを行うことになっているものです。そこから上に行くあなたは既にやるだけのように、データの残りの部分を左結合ます。
他のヒント
、JOINそれが問題だ、すべての組み合わせを返します。
あなただけの記事につき1つのオーディオおよび/またはvideofileを持っているなら、あなたは副問い合わせで見たいと思うかもしれません。
SQL Serverでの、これが(未テストコード)のようになります:
SELECT title,
(select TOP 1 audio from audio where audio.aid = articles.id) as Audio,
(select TOP 1 video from video where video.aid = articles.id) as Video
FROM articles
この例では副問い合わせを外部クエリに戻す行ごとに個別に実行される大規模なデータセットにこれが不十分実行できることに注意してください。あなたは万件の記事を返す場合たとえば、その後、20001個のクエリの合計は、実際にサーバ上で実行されます。 そこにこれを克服するための他の可能な答えがあるが、彼らは(私はあなたが派生テーブルで何かを行うことができます疑うが、それは現時点では私を見逃さ)より巻き込まます。
あなたは、おそらくそれはビューにクエリを結合最適化したいです。これは、大規模なクエリだし、その多くが参加すると、かなり非効率的になるだろう。プラス、ビューはあなたがあなたのクエリのデバッグを支援することができた、個別に(ビュー)結合および(ビューからあなたの選択で)WHERE句。