4

このタスクを達成するために MySQL クエリを作成する方法は?

表:ライター

w_id    w_name
---------------
  1     Michael
  2     Samantha
  3     John
---------------

表:記事

a_id   w_id   timestamp   a_name
----------------------------------------
  1      1        1       PHP programming
  2      3        3       Other programming languages
  3      3        5       Another article
  4      2       15       Web design
  5      1       20       MySQL
----------------------------------------

5より前に最初の記事を公開した作家だけをCOUNTする必要があります。(少なくとも1つの記事を公開した作家のみがカウントされます)


この例では、結果は次のようになります: 1 (1 人のライター - サマンサ) SQL コードは 、この SQLFiddle

でテストできます。

4

8 に答える 8

3

ダブルSELECTが必要です。

w_id最初に、最初の記事のタイムスタンプとともにをフェッチします。

SELECT w_id, MIN(timestamp) as publish FROM articles GROUP BY w_id

publish次に、5より前ではないことを要求します。

SELECT w_id, MIN(timestamp) as publish
    FROM articles
    GROUP BY w_id
    HAVING publish >= 5;

次に、必要に応じて、その「テーブル」に参加しwritersて名前を取得します。

ただし、カウントのみが必要な場合は、writersテーブルはまったく必要ありません。

    SELECT COUNT(*) AS answer FROM
    ( SELECT w_id, MIN(timestamp) AS publish
        FROM articles
        GROUP BY w_id
        HAVING publish >= 5
) AS counter;

テスト:http ://sqlfiddle.com/#!2 / 0e90f / 30/0

于 2012-09-20T12:33:04.277 に答える
2

ライターの最小値を取得するには、サブクエリが必要timestampです。すでに集計されている列を集計できないため、結果がカウントされます(例:COUNT(MIN(columnName))

SELECT COUNT(*) totalWriters
FROM
(
  SELECT  a.w_id, MIN(b.`timestamp`)
  FROM    writers a
          INNER JOIN articles b
            ON a.w_id = b.w_id
  GROUP BY a.w_id
  HAVING MIN(b.`timestamp`) >= 5
) a

SQLFiddleデモ

于 2012-09-20T12:32:58.443 に答える
2
select 
  w_name
from writers w
join articles a on w.w_id = a.w_id
group by w.w_id,w.w_name
having min(timestamp)>=5

フィドルで.. http://sqlfiddle.com/#!2/0e90f/11/0

またはカウントする..

select 
 count(w_name)
from writers w
join articles a on w.w_id = a.w_id
group by w.w_id,w.w_name
having min(timestamp)>=5

フィドルで.. http://sqlfiddle.com/#!2/0e90f/27/0

于 2012-09-20T12:31:09.903 に答える
2

簡単です。クエリは次のとおりです。

SELECT count(DISTINCT w_id)
FROM articles
WHERE TIMESTAMP>=5 
AND w_id NOT IN (SELECT w_id FROM articles WHERE TIMESTAMP<5);

SQL フィドルを参照してください

于 2012-09-20T13:11:52.593 に答える
1

簡単な解決策:

SELECT COUNT(DISTINCT w_id)
FROM writers
WHERE w_id NOT IN
(SELECT w_id from articles
 WHERE timestamp <=5)
于 2012-09-20T12:33:32.793 に答える
1
select count(1) from (
     select w.w_id, count(a.timestamp) cnt from writers w
     inner join articles a on a.w_id = w.w_id
     group by w.w_id
  ) t
inner join articles art on art.w_id = t.w_id
where t.cnt = 1 and art.timestamp > 5
于 2012-09-20T12:45:39.270 に答える
1
select count(*)
from (
    select w_id, min(`timestamp`) as `timestamp`
    from articles
    group by w_id
) s
where `timestamp` >= 5
于 2012-09-20T12:36:44.677 に答える
1

これを試してください、私はちょうどテストしました..

select*   from ( select tblw.w_id, count(tblart.timestamp) count from writers tblw  inner join articles tblart on tblart.w_id = tblw.w_id   group by tblw.w_id ) temp inner join articles art on art.w_id = temp .w_id where temp .count = 1 and art.timestamp > 5
于 2012-09-20T12:56:07.130 に答える