質問

ようにしているラバー-

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 の考え方を同時に VideoAudio ファイルから 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テーブルに参加しなければならないことを意味 - 。タイプごとに一度

ファイルの種類ごとに1つの行を選択します。

これは、結合条件でサブクエリを行うことになっているものです。そこから上に行くあなたは既にやるだけのように、データの残りの部分を左結合ます。

他のヒント

、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句。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top