3

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

main:id_main、field1、filter

main_logs(5000万行):auto inc、id_main、path

次の結果を探しています:id_main、field1、最も一般的なパス

私は次のクエリを試しました:

select id_main, 
  field1, 
  (select path, count(*) as cpt 
   from main_log 
   where main_log.id_main=main.id_main group by path order by cpt desc limit 1) 
from main 
where filter in (1,3,5);

Mysql return:オペランドには1つの列が含まれている必要があります

パスを削除すると、結果は正しくなりますが、パスの値が失われます。

select id_main, 
  field1, 
  (select path, count(*) as cpt 
   from main_log 
   where main_log.id_main=main.id_main group by path order by cpt desc limit 1) 
from main 
where filter in (1,3,5);

count(*)の結果は必要ありませんが、「順序付け」には必要です

結果を取得するためにこのクエリを作成するにはどうすればよいですか?ありがとう

主要

id_main     | field1    | filter
1       | red       | 1
2       | blue      | 3
3       | pink      | 1

main_logs

autoinc     | id_main   | path
1       | 1         | home1
2       | 1         | home2
3       | 1         | home2
4       | 2         | house2
5       | 2         | house7
6       | 2         | house7
7       | 3         | casee

期待される結果

id_main     | fields1   | most common path
1       | red       | home2
2       | blue      | house7
3       | pink      | casee
4

4 に答える 4

3

あなたは使用する必要があります:

SELECT id_main, field, 
    (SELECT path 
    FROM main_logs 
    WHERE id_main=main.id_main 
    GROUP BY path 
    ORDER BY count(path) DESC 
    LIMIT 1) AS most 
FROM main 
WHERE filter IN (1,3,5);

テスト済み、動作しています。

于 2013-01-04T12:17:24.750 に答える
2

これを試して:

SELECT m.id_main, m.field1, A.path 
FROM main m 
INNER JOIN (SELECT * 
            FROM (SELECT id_main, path, COUNT(*) cnt
                  FROM main_log ml  
                  WHERE EXISTS (SELECT * FROM main m WHERE ml.id_main = m.id_main AND filter IN (1,3,5))
                  GROUP BY id_main, path 
                  ORDER BY cnt DESC
                  ) AS A 
            GROUP BY id_main
            ) AS A ON m.id_main = A.id_main;

古いコードは無視します

SELECT m.id_main, m.field1, A.path 
FROM main m 
INNER JOIN (SELECT * FROM (SELECT id_main, path, count(*) cnt
            FROM main_log 
            GROUP BY id_main, path 
            ORDER BY cnt DESC) GROUP BY id_main) as A on m.id_main = A.id_main 
WHERE filter IN (1,3,5);
于 2012-12-25T16:47:19.647 に答える
0

サブクエリに2つの列を返します。あなたはただ1つを返す必要があります。

サンプルデータ:

ID_MAIN     FIELD1  FILTER
1   h   1
2   x   2
3   y   3


AUTOINC     ID_MAIN     PATH
11  1   abc
12  2   abd
13  1   xyz
14  1   ghf
15  2   xyz

試してみてください:SQLFIDDLE

クエリ:

select id_main, 
  field1, 
  (select count(id_main) as cpt 
   from main_logs 
   where main_logs.id_main=main.id_main 
   group by path 
   order by cpt desc limit 1) as CPTs
from main 
where filter in (1,3,5);

結果:

ID_MAIN     FIELD1  CPTs
1       h   1
3       y   (null)

各IDのパスごとの最大カウントを提供するように編集します

間違いなく最も洗練されたクエリではありません。参加しすぎてサブクエリを実行すると、パフォーマンスがかなり遅くなる可能性があります。

テーブル、id = 3、ピンクフィルター= 5を除いて、サンプルデータに従います。したがって、これは基準mainに準拠しています。filterただし、その基準がなくても、次のクエリはロジックに対して適切に機能するようです。

クエリ:

select a.id, b.path, a.mx
from
(select x.id, x.path, max(x.ct) as mx
from (
select m.id_main as id, ml.path, 
count(ml.id_main) as ct
from main m
left join 
main_logs ml
on ml.id_main = m.id_main
group by ml.path) as x
group by x.id) as a
inner join 
(select m.id_main as id, m.filter, ml.path, 
count(ml.id_main) as ct
from main m
left join 
main_logs ml
on ml.id_main = m.id_main
group by ml.path) as b
on a.id = b.id
and a.mx = b.ct
where b.filter in (1,2,3)
order by a.mx desc
;

結果:

ID  PATH    MX
1   home2   2
2   house7  2
3   casee   1
于 2012-12-25T16:47:57.400 に答える
0
SELECT 
    m.id_main,
    m.field1,
    ml.path,
    IFNULL(ml.Count,0)
FROM main as m
LEFT JOIN (
           SELECT
                 id_main, 
                 path,
                 COUNT(path) as Count
           FROM main_logs
           GROUP BY id_main
          ) as ml on ml.id_main = m.id_main
于 2012-12-25T16:52:11.307 に答える