1

私は2つのテーブルを持っています:

ポイント->

id           bigint(20)   NO   PRI  NULL   auto_increment
created_at   datetime     NO        NULL   
ip           varchar(255) NO        NULL   
item_id      bigint(20)   NO   MUL  NULL   
updated_at   timestamp    YES       NULL   

およびアイテム->

id           bigint(20)    NO  PRI  NULL   auto_increment
author       varchar(255)  NO       NULL   
created_at   datetime      NO       NULL   
description  varchar(255)  NO       NULL   
link         varchar(255)  NO       NULL   
source       varchar(255)  NO       NULL   
title        varchar(180)  NO       NULL   
url_encoded  varchar(255)  NO  UNI  NULL   
updated_at   timestamp     YES      NULL   

うまくいけば、1つのクエリに参加させて、item.*それらに関連するポイントの合計を取得します。また、過去24時間にポイントが作成されたアイテムに対してのみこれを実行したいと思います。

これはこれまでの私の質問です:

SELECT `items`.*, COUNT(points.item_id) as points
FROM `items`
INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE `points`.`created_at` > '2013-03-16 16:00:14'
ORDER BY points DESC
LIMIT 30;

残念ながら、2行になると1行になり、1行になると2ポイントになります。私のデータベースには、2つのアイテムとそれぞれに1つのポイントがあります。これを修正し、両方の結果を取得するためにクエリを改善する方法を理解するのを手伝ってください。

4

3 に答える 3

3

GROUP BYどのグループに基づいてカウントするかを説明するために使用する必要があります。ご覧のとおりGROUP BY、結果セット全体の単一のグループを取得するだけです。

標準SQLでは、句に含まGROUP BYれるすべての非集計式を句に含める必要がありSELECTますが、MySQLではこれを行わなくてもかまいません。これにより、次のような式が可能になります。(少なくとも、厳密モードでない場合、厳密モードが標準SQLに一致するようにこの要件を強化するかどうかはわかりません)

SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`

items.idこれがこのテーブルの主キーであり、複数の行に表示されないと仮定するとitems、これは望ましい効果をもたらすはずです。

紹介したら、と句GROUP BYの違いを理解することが重要です。前者はグループと集計が適用されるに条件を適用し、後者は後で適用されます。これは、そのカウントに基づいて条件付きを実行する場合に使用する必要があることを意味します。最初の例の句は集計の前に適用されるため、結果は指定された日付以降に作成されたポイントの数になります。WHEREHAVINGHAVINGWHERE

于 2013-03-17T18:44:24.460 に答える
2
于 2013-03-17T18:41:08.997 に答える
0

テーブルリンクを作成します。フィールドid、、、itemid_pointsid

入力:

Row1: 1, items-id1, points-id-1
Row2: 2, items-id-1, points-id-2
Row3: 3, items-id-1, points-id-3
SELECT * FROM points, field WHERE tablelink.itemid=items.id AND tablelink.pointsid=points.id;

1つのアイテムには多くのポイントがあります。

于 2020-05-07T16:11:02.887 に答える