2

私は次のデータ構造を持っています:記事にはm:nユーザーがいます

3つのテーブルがあります:articlesusersarticles_users(リンクテーブル)

今、私はこのクエリが必要です:最近記事を書いたすべてのユーザーを教えてください

残念ながら、このクエリは重複した結果を返します。

SELECT  DISTINCT users.id, 
        users.username, 
        articles.published, 
        articles_users.user_id
FROM    users 
        INNER JOIN articles_users 
            ON users.id = articles_users.user_id
        INNER JOIN articles     
            ON articles.id = articles_users.article_id
ORDER BY articles.published DESC
LIMIT 25;

結果:

id      username        published   user_id
113     silva_mihat     2012-10-30  112
228     paula_tille     2012-10-27  258
228     paula_tille     2012-10-26  258
631     andrea_gurkow   2012-10-24  631
275     hubert_mayer    2012-10-24  275
198     annette_mulger  2012-10-22  198
255     uta_zuffter     2012-10-22  235
and so on ...

DISTINCTがここで機能しない理由を誰かが知っていますか?

4

2 に答える 2

1

これは、記事ごとではなく、著者ごとにグループ化する必要があります。

select
  users.id,
  users.username,
  maxPublished
from users
inner join (
  select
    max(articles.published) as maxPublished,
    articles_users.user_id as userID
  from articles
  join articles_users on articles_users.article_id = articles.id
  group by articles_users.user_id
) as p on users.id = userID
order by maxPublished desc
limit 25
;
于 2012-10-31T15:37:37.963 に答える
1

DISTINCT行全体に適用されるためです(それ自体だけではありません users.id)。ご覧のとおり、返されるすべての行は一意ではありません。このようなものを試してみてください。サブクエリの背後にある考え方は、publishedそれぞれの最近の日付を取得することですarticle_id

SELECT  users.id, 
        users.username, 
        articles.published
FROM    users 
        INNER JOIN articles_users 
            ON users.id = articles_users.user_id
        INNER JOIN articles 
            ON articles.id = articles_users.article_id
        INNER JOIN 
        (
            SELECT id, MAX(published) maxDate
            FROM articles
            GROUP BY id
        ) c ON  articles.id = c.ID AND 
                articles.published = c.maxDATE
-- ORDER BY articles.published DESC
-- LIMIT 25
于 2012-10-31T15:09:17.880 に答える