2013-03-25 18 views
84

私は左の結合の最初の行を取得することについて多くのスレッドを読んだが、何らかの理由でこれは私のためには機能しません。ここでLEFT JOINのみ最初の行

は(もちろん簡体字)私の構造である

id | title | content 
---------------------- 
1 | Feed 1 | ... 

アーティスト

artist_id | artist_name 
----------------------- 
1   | Artist 1 
2   | Artist 2 

feeds_artists

フィード
rel_id | artist_id | feed_id 
---------------------------- 
1  |  1  | 1 
2  |  2  | 1 
... 

今、私は記事を取得し、最初のアーティストに参加したいと私はこのような何かを考えた:

SELECT * 
    FROM feeds 
    LEFT JOIN feeds_artists ON wp_feeds.id = (
     SELECT feeds_artists.feed_id FROM feeds_artists 
     WHERE feeds_artists.feed_id = feeds.id 
    LIMIT 1 
    ) 
WHERE feeds.id = '13815' 

だけfeeds_artistsの最初の行だけを取得するには、すでに、これは動作しません。 。

私は(私は彼らにこの方法をグループ化することによって、結果を得たが、ない結果が最新)日付によってそれらをソートする必要があるように私はので、私のデータベースのTOPを使用することはできませんし、私はfeeds_artists.artist_idによってグループの結果をすることはできません

OUTERと一緒に試してみてください。成功もありません。 正直言って、私はそれらの行に何が起こっているのか想像することはできません - おそらく、私はこれがうまくいかない最大の理由です。

SOLUTION:

SELECT * 
FROM feeds f 
LEFT JOIN artists a ON a.artist_id = (
    SELECT artist_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.id 
    LIMIT 1 
) 
WHERE f.id = '13815' 
+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – Sinux

+0

ここに解決策がありますhttps://stackoverflow.com/a/7588442/612987 –

答えて

68

あなたが時間をかけてそのアーティストのID増分をとることができる場合は、MIN(artist_id)が早いだろう。

ので(未テスト...)このような何かをしようと

SELECT * 
    FROM feeds f 
    LEFT JOIN artists a ON a.artist_id = (
    SELECT 
     MIN(fa.artist_id) a_id 
    FROM feeds_artists fa 
    WHERE fa.feed_id = f.feed_id 
) a 
+0

お早めにありがとう応答。これは正確な答えではありませんでしたが、完全に正しい方法で私を得ました。私はいつも同じレベルに参加しようとしました。正しい軌道に乗ってくれてありがとう、ありがとう。最初の投稿 – KddC

+0

@KddCを編集して、質問を変更して回答を追加したり、この回答を編集したり、あなた自身の回答をしたりすることはありません。 – PhoneixS

+3

この時点では単純なサブクエリが良いとは思わないでしょうか?これで、結合とサブクエリが作成されました。私は同じ問題に解決策を探している原因を尋ねるだけです:) – galdikas

46

副選択なしバージョン:

SELECT f.title, 
      f.content, 
      MIN(a.artist_name) artist_name 
    FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
+1

これは受け入れられた答えであるべきだと思います – Binod

+2

これは最初の行(最初のIDまたは何か他のものの最初の行)とは思われません。 – Sinux

+15

このクエリは間違っています。それはセットの最初のアーティストの名前ではない "最も低い"アーティスト名を選択します。 – Glapa

3

は最初の著者が参加する副選択なしバージョン:

SELECT f.title, 
     f.content, 
     a.artist_name artist_name, 
     min(a.id) as m 
FROM feeds f 
LEFT JOIN feeds_artists fa ON fa.feed_id = f.id 
LEFT JOIN artists a ON fa.artist_id = a.artist_id 
GROUP BY f.id 
HAVING a.id = m; 
+0

これはDenisの応答と同じ問題を抱えています。最初のものではなく、ランダムな行が追加されます。 – Ether

+0

@その他、同じ問題はありません。私は最後に「HAVING」を持っています。 – Glapa

+2

@Glapaしかし、 'HAVING'は' feeds_artists'がすでに集約されているときに 'GROUP BY'の後に適用されます。 –

0

私は何か他のものを使用しました(私はより良いと思います...)、それを共有したい:

私は、少なくとも...私は、私たちが分析で何かを間違ってなかったので、我々はこのソリューションを実行する必要があると考えていることを、まだ言いたい「グループ」句

CREATE VIEW vCountries AS SELECT * PROVINCES GROUP BY country_code 

SELECT * FROM client INNER JOIN vCountries on client_province = province_id 

を持つVIEWを作成

私の場合は...しかし、時にはこれを行うことですべてを再設計するのが安いです...

私はそれが助けてくれることを望みます!