6
select `personal`.`id` AS `id`,
`personal`.`name` AS `name`,
(select count(visit.id) 
      from visit,personal 
        where visit.user_id=personal.id) as count 
from personal;

すべてのユーザーとその訪問回数を取得しようとしています。

私が得る結果はすべてのユーザーですが、カウント列には同じ値が含まれています(その行IDに固有のものではありません)。

ここで何が間違っていますか?この行IDを使用するようにmysqlに指示する方法は?

それを行うための複合選択最適な方法はありますか、それともより良い方法がありますか?

4

4 に答える 4

20
SELECT  p.id, p.name, COUNT(v.user_id)
FROM    personal p
LEFT JOIN
        visit v
ON      v.user_id = p.id
GROUP BY
        p.id

もちろん、サブセレクトを使用することもできます(たとえば、ANSI GROUP BY互換性がある場合):

SELECT  p.id, p.name,
        (
        SELECT  COUNT(*)
        FROM    visit v
        WHERE   v.user_id = p.id
        )
FROM    personal p
于 2013-01-15T12:44:07.260 に答える
2

これを試して

 SELECT
Pe.id AS id,Pe.name AS name,COUNT(v.user_id) number_visit
FROM personal Pe
LEFT JOIN visit Vi
   ON Vi.user_id= Pe.id
GROUP BY Pe.id
于 2013-01-15T12:46:38.447 に答える
1

これを試して:

select
   p.id AS `id`,
   p.name AS `name`, 
   IFNULL(v.TheCount, 0) TheCount
from personal p
LEFT JOIN
( 
  SELECT user_id, COUNT(*) TheCount
  FROM visits v
  GROUP BY user_id
) v ON v.user_id = p.Id;
于 2013-01-15T12:50:12.747 に答える
0

これは、が付いたLEFT JOINテーブルpersonalで機能しvisitます。

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit
FROM
    personal Pe
LEFT JOIN
    visit Vi ON Vi.user_id = Pe.id
GROUP BY Pe.id

少なくとも訪問数1のユーザーのみが必要な場合は、RIGHT JOINORHAVINGを実行します。Group By

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit
FROM
    personal Pe
RIGHT JOIN
    visit Vi ON Vi.user_id = Pe.id
GROUP BY Pe.id

また

SELECT 
    Pe.id AS id, Pe.name AS name, COUNT(v.user_id) number_visit
FROM
    personal Pe
LEFT JOIN
    visit Vi ON Vi.user_id = Pe.id
GROUP BY Pe.id HAVING number_visit > 1
于 2013-01-15T12:48:38.180 に答える