0

私は小さなRSSフィードメール送信者を開発しています。

私が持っている4つのテーブルは、Users、Feeds、Subscriptions、およびDistributionです。フィードには実際のフィードの詳細が含まれ、サブスクリプションはユーザーをフィードに接続し、配布はrssフィード投稿の電子メールトランザクションを記録します。

各ユーザー/フィードサブスクリプションの最新のレコードを取得するために、Distributionテーブルをクエリしようとしています。次のクエリがありますが、明らかに1行しか返されません。サブクエリを使用する必要がありますが、その方法に頭を悩ませることはできません。

SELECT d.id, d.user_id, d.feed_id, d.created
FROM Distribution AS d
INNER JOIN Feeds AS f ON f.id = d.feed_id
INNER JOIN Subscriptions AS s ON s.feed_id = d.feed_id
GROUP BY d.id, d.user_id, d.feed_id
ORDER BY d.created DESC 
LIMIT 1

配布テーブルのデータID、作成済み、feed_id、post_id、user_id、success

(0, '2012-08-31 09:37:49', 20, 3, 2, 1)
(1, '2012-08-25 09:36:21', 20, 1, 1, 1)
(2, '2012-08-25 09:37:49', 21, 1, 2, 1)
(4, '2012-08-25 09:39:06', 21, 4, 1, 1)
(5, '2012-08-25 10:12:29', 20, 7, 2, 0)
(6, '2011-05-24 10:34:30', 20, 112, 1, 0)

次のクエリは次の結果を生成します

SELECT Distribution.*
FROM   Distribution NATURAL JOIN (
  SELECT   user_id, feed_id, MAX(created) AS created
  FROM     Distribution
  GROUP BY user_id, feed_id
) t

(0, '2012-08-31 09:37:49', 20, 3, 2, 1)
(1, '2012-08-25 09:36:21', 20, 1, 1, 1)
(2, '2012-08-25 09:37:49', 21, 1, 2, 1)
(4, '2012-08-25 09:39:06', 21, 4, 1, 1)
4

1 に答える 1

2

MySQLマニュアルで説明されているように:

サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。さらに、各グループからの値の選択は、ORDER BY句を追加することによって影響を受けることはありません。結果セットの並べ替えは、値が選択された後に行われ、ORDER BYサーバーが選択する値には影響しません。

グループごとの最大値を見つけようとしています。これには、サブクエリを使用して最新のレコードを識別する必要があります。

サブクエリ自体は、列でMySQLのMAX()関数をcreated使用して、各グループ内の最新のレコードの対応する値を識別し、その情報を使用して、外部/親クエリのテーブルと結合する必要があります。これがあなたが求めているものだと思いますが、テーブルスキーマ/サンプルデータがないと確信が持てません(少なくとも、正しいパスに設定する必要があります):

SELECT Distribution.*
FROM   Distribution NATURAL JOIN (
  SELECT   user_id, feed_id, MAX(created) AS created
  FROM     Distribution
  GROUP BY user_id, feed_id
) t
于 2012-08-25T15:27:38.017 に答える