2017-07-30 11 views
0

私はいくつかの列を持つDBを持っている、私はそれをHTMLテーブルを作成しようとしています。 すべてがうまくいっていますが、次の問題が発生しました:select *、count(*)in oneクエリ

フィルタリングされた結果を別の列に埋め込むので、Select *とcount(*)の両方を必要とするSQLクエリが出ましたか?

$query = "SELECT *, COUNT(example_A) AS total_example_A FROM test WHERE example_A = 'certain_result' AND date(start_date) = '$current_date_proof' ORDER BY start_date ASC"; 

これは機能しますが、最初の結果しか得られません。 SelectとCountを組み合わせることはできないと思いますか?あなたは、相関サブクエリでそれを行うことができます

+0

select *の機能とcount(*)の機能について理解してください。 Count(*)はグループの集合の結果を返します。スカラーです。したがって、単一行しか返しません。 – Gunnrryy

+0

'COUNT'は集約関数であるため、' GROUP BY'を使用する必要があります。 – fubar

+0

@Gunnrryy正確に言うと、Countや集計関数( 'Avg'、' Sum'、...)はグループごとに1つの行を返します。 –

答えて

0

、カウントが集計関数(そう、それはすべてのデータを集計または組み合わせ)である:

$query = " 
    SELECT 
     t1.*, 
     (SELECT COUNT(t0.id) FROM test AS t0 WHERE t0.id = t1.id) AS total_example_A 
    FROM 
     test AS t1 
    WHERE 
      t1.example_A = 'certain_result' 
     AND 
      date(t1.start_date) = '$current_date_proof' 
    ORDER BY t1.start_date ASC 
"; 

これはあなたのテーブルtestidという名前の主キーを持っていることを前提としてい。私の世界では、データベースには、Auto Increment Intが主キーとして存在するか、2つ以上の外部キーからなる複合主キーがあります。それ自体はAuto Increment Intフィールドです。常にあなたのテーブルにサロゲートキーを置くことは重要です(IMO)。それはデータそのものとは直接関係のない鍵です。しかし、それはちょうど私です...

あなたのアプリケーション内の戻り値を数えることができますが、相関サブクエリはあなたに最高の/良いパフォーマンスを与えるはずです。確かに別のデータベース呼び出しよりはるかに良い。

+0

ありがとう、私はこれを試してみます。そして、はい、私は自動インクリメント付きのIDを持っています - それを使用するとは思わなかった! – Kris

+0

これはうまくいきますが、カウント結果が間違っているようです(= 1)。私の例では2になるはずです。 – Kris

+0

私はあなたが持っているデータなしで、サブクエリなしでクエリを実行しようとしたのか、それが何を引き出すのかを知る方法はありません。 – ArtisticPhoenix