3

私はこのようなものを持っています:

(SELECT COUNT(*) AS total FROM `transactions` WHERE 
   `asset`='u_{$user_id}' GROUP BY id)
 UNION DISTINCT 
(SELECT COUNT(*) AS total FROM transactions tr 
   INNER JOIN payments pa ON tr.asset = CONCAT('p_', pa.id) 
   WHERE pa.user_id = '{$user_id}' 
   GROUP BY tr.id)

それは与えます1

次のように動作します。

SELECT
 (SELECT COUNT(*) FROM `transactions` 
    WHERE `asset`='u_{$user_id}')
  + 
 (SELECT COUNT(*) FROM transactions tr 
    INNER JOIN payments pa ON tr.asset = CONCAT('p_', pa.id) 
    WHERE pa.user_id = '{$user_id}')

それは与えます6

しかし、私は取得する必要があります5..、正しいクエリを作成する方法を教えてください。

確かに、私はこれを php で行うことができますが、..どのように SQL で..?

本当に "and" および "or" 条件は問題ではありません。それらは正しく機能します。問題は、UNION`ed クエリのカウントにあります。2 番目のクエリは合計 (1+5) を正しくカウントしますが、値はクエリと交差します。最初のものは、最初のサブクエリの結果を返します。だから、カウントする前に結果を一意にする必要があります...

PHP では、次のようになります。次のようなものを取得するために、ループ内で長いクエリを構築するよりも、支払いとの内部結合によってトランザクション ID リストを取得します。SELECT COUNT(*) FROM transactions WHERE (*what i have now* OR id=$id_1 OR id=$id_2 OR id=$id_3 etc..)

UPD: カット済み

解決しました!=)

SELECT COUNT(*) FROM(
SELECT tr.* FROM transactions tr 
WHERE tr.asset='u_{$user_id}' OR (tr.liability='g' AND tr.l_info='{$user_name}')
UNION SELECT tr.* FROM transactions tr 
INNER JOIN payments pa ON tr.asset = CONCAT('p_', pa.id) 
WHERE pa.user_id = '{$user_id}' AND pa.status='100') 
AS total

ASの合計が重要です!

4

1 に答える 1

0

私はあなたの質問を調べました.union句から最大値を取得したいと思います.mySqlを知らないので、MS-SQLであなたの質問を解決しました.

ロジック:- CTE を使用し、その後 UNION 操作を実行してから、2 つから MAXIMUM を選択しました。

WITH COUNTT AS (SELECT 1 AS TEST
UNION 
SELECT 5 AS TEST)
SELECT MAX(TEST) FROM COUNTT

ハードコードされた「1」と「5」の代わりに、カウントクエリを使用できます。それが探しているものだと思います。そして、それを答えとしてマークしてください。

于 2014-01-03T05:06:16.733 に答える