-1

行の配列を返す mysql クエリがあります。1 つの列から個別の値の数を取得する必要があります。私のクエリは動的で、php によって評価される複数の条件が WHERE 句を変更するため、すべての動的条件の重複を避けるために、可能であれば 1 つのクエリ内ですべてを実行したいと考えています。

これが私がやりたいことの簡単なバージョンです -

これが私のSQLテーブルの非常に単純なバージョンを表している場合:

Column1, Column2, Column3, Group, Active
   a   ,    b   ,    c   ,   1  ,  YES
   d   ,    e   ,    f,  ,   2  ,  YES
   g   ,    h   ,    i   ,   1  ,  YES
   j   ,    k   ,    l   ,   3  ,  NO

私はこのようなことをしたいと思います:

"SELECT Column1, Column2, Column3, Group,
(SELECT COUNT(DISTINCT Group) FROM 'table') AS totalGroups
 FROM 'table'
WHERE Active like 'YES';"

結果を報告できるようにしたい:

a) クエリの合計行

mysql_num_rows($result) should equal = 3

b) 異なるグループの総数

$phparray['totalgroups'] should equal = 2
(Right now, 'totalgroups' equals = 3)

(1) できるか?現在、'totalgroups' は 2 ではなく 3 を返します。クエリの残りの部分と同じ "Where" 句を使用するようにできますか?

はるかに複雑な実際のコードでは、2 だけを返したいのに、カウントが 1,945 を返しています。:)

(2) より良い方法はありますか?

php のarray_unique()とを試しましarray_count_values()たが、多次元配列では機能せず、正しく動作しarray_unique()ませんでした。array_count_values()

私は他の多くの質問を見ましたが、誰かがこの特定の質問をしている場所を見つけることができませんでした. MYSQL マニュアルの RE サブクエリを確認しましたが、Where 句を共有できるかどうかについては触れられていませんでした。

この質問に答えるために (上記のデモ表現ではなく) 私の実際のコードが必要な場合は、お知らせください。すべての php 動的修飾子を含む 2 ページを超えるので、わかりやすくするためにデモ コードを記述することにしました。

4

1 に答える 1

2

テーブルのすべてのレコードのリストを取得しようとしていて、各行にアクティブな行の数と一意のアクティブなグループの数が表示されていますか?

もしそうなら、このようなもの: -

SELECT Column1, Column2, Column3, Group, ActiveDistinctGroups.ActiveCnt, ActiveGroups.ActiveCnt
FROM 'table' a
CROSS JOIN (SELECT COUNT(DISTINCT Group) AS ActiveCnt FROM 'table' WHERE Active like 'YES') AS ActiveDistinctGroups
CROSS JOIN (SELECT COUNT(Group) AS ActiveCnt FROM 'table' WHERE Active like 'YES') AS ActiveGroups
WHERE Active like 'YES'

余分な WHERE 句を本当に避ける必要がある場合:-

SELECT Column1, Column2, Column3, Group, ActiveDistinctGroups.ActiveCnt, ActiveGroups.ActiveCnt
FROM 'table' a
INNER JOIN (SELECT Active, COUNT(DISTINCT Group) AS ActiveCnt FROM 'table' GROUP BY Active) AS ActiveDistinctGroups ON a.Active = ActiveDistinctGroups.Active
INNER JOIN (SELECT ActiveCOUNT(Group) AS ActiveCnt FROM 'table' GROUP BY Active) AS ActiveGroups ON a.Active = ActiveGroups.Active
WHERE a.Active like 'YES'
于 2013-05-03T15:38:59.280 に答える