0

次のテーブル構造を考慮してください (これはサンプル データであるため、同一のタイムスタンプは無視してください)。

+---------+---------+------------+-----------+
| list_id | item_id | date_added | is_active |
+---------+---------+------------+-----------+
|    1    |     1   | 1352073600 |     1     |
|    1    |     2   | 1372073600 |     1     |
|    1    |     3   | 1332073600 |     1     |
|    1    |     4   | 1302073600 |     1     |
|    2    |     1   | 1302073600 |     1     |
|    3    |     1   | 1302073600 |     1     |
+---------+---------+------------+-----------+

クライアントは、特定の日に作成されたリストの数を表示したいと考えています。リストは最初のアイテムが追加されたときに作成されますが、日付は明示的に保存されず、アイテムが追加された日付のみが保存されます。

私の質問はこれです:

MySQL (およびタイムスタンプを計算するための PHP) を使用して、特定の日に作成されたリストの数を返すにはどうすればよいですか。基本的に、ロジックは (疑似コード) である必要があります。

  • tbl_list_items>= min_agedate_addedおよび<= max_ageから合計レコードを選択しdate_added、レコードがこのリストで最も古い

私が探しているものを説明するのは難しいので、次のアクションを検討してください。

No items added to lists yet (i.e. all lists have 0 items)
User added `item_id = 1` to `list_id = 1` yesterday.
User added `item_id = 2` to `list_id = 1` today.
User added `item_id = 1` to `list_id = 2` yesterday.
User added `item_id = 1` to `list_id = 3` yesterday.
User added `item_id = 2` to `list_id = 2` today.

昨日作成されたリストの数 (または、昨日最初のアイテムが追加されたリストの数) を調べたい場合は、アイテムが最初に追加された合計数 = 昨日を返したいと思います。上記のアクション セットを指定すると、これは合計 3 (つまりlist_id = 1list_id = 2およびlist_id = 3) を返します。

4

5 に答える 5

1

これは、特定の日に作成されたリストのリストを返します。

SELECT list_id, min(date_added) AS date_creation
FROM tbl_list_items
GROUP BY list_id
HAVING min(date_added) >= @min_age AND min(date_added) <= @max_age

それらをカウントするには、クエリの結果の数をカウントするか、次のようなサブクエリを使用できます。

SELECT COUNT(*) AS total FROM
(
    SELECT list_id, min(date_added) AS date_creation
    FROM tbl_list_items
    GROUP BY list_id
    HAVING min(date_added) >= @min_age AND min(date_added) <= @max_age
)

ただし、クエリごとにテーブル全体を GROUP BY する必要があるため、これはまったく最適化されていないことに注意してください。リストの最初の項目が追加されたときにフラグ ( creation = 0 | 1 ) を追加する方が良いかもしれません。

于 2012-11-05T15:36:17.203 に答える
0

特定の日のレコードを選択する場合、なぜ指定するmin_agemax_ageですか?単一の日付(たとえば、YYYY-MM-DDの形式)と比較する必要があります。

select count(*) from table_name where from_unixtime(date_added, %Y-%m-%d) = $date group by list_id

またはそのようなもの。

于 2012-11-05T15:21:13.363 に答える
0

それらはUNIXタイムスタンプのように見えます。その場合、次のようなことができます

SELECT ..
FROM ...
WHERE DATE(FROM_UNIXTIME(date_added)) = '2012-11-03'

派生値を比較しているため、これは非効率的であることに注意してください-インデックスは使用されません。

于 2012-11-05T15:18:41.720 に答える