2017-03-01 10 views
0

フィールド 'id_px'にフィールド 'id_category'に異なる値があるため、フィールド 'id_px'に繰り返し値があるテーブルがあり、正確な値を持つ 'id_px'のすべての値を取得したいとします。たとえば:別のフィールドに特定の値を持つフィールドのすべての値を選択するにはどうすればよいですか?

SELECT id_px FROM my_table WHERE id_category = 1 **AND** id_category = 32; 

私は私が望む結果取得方法が見つかりました:

SELECT id_px 
FROM my_table 
GROUP BY id_px 
HAVING SUM(id_category NOT IN (1,32)) = 0 
AND SUM(id_category = 1) = 1 
AND SUM(id_category = 32) = 1 

を私は、私はいくつかのUNION句を使用する必要があるため、それはwhitout HAVING句を使用します。

ご支援いただければ幸いです。

+0

最初のクエリでORを使用できませんか?あなたが理解しているように、id_categoryの特定の値を持つレコードだけが必要です。 – smb564

+0

私は特にあなたの両方を持っている必要があるからではありません。あなたが持っている場合はありません。私は両方のIDを具体的に持たせる必要があります。 –

+0

あなたの質問を更新し、適切なデータサンプルと予想される結果を追加できますか? – scaisEdge

答えて

-1

私はいくつかの方法を提案:

、3-第三1:(回答として勤務してマークされている)

SELECT tbl.id_px FROM 
    (SELECT id_px , 
    SUM(id_category NOT IN (1,32)) as b , 
    SUM(id_category = 1) as t1 , SUM(id_category = 32) as t2 
    FROM my_table 
    GROUP BY id_px) as tbl 
WHERE tbl.b = 0 AND tbl.t1 = 1 AND tbl.t2 = 1 

、4-再構築クエリ-2:

4.1 - 最初のステップ再構築:(非効率的な)012で

SELECT tbl.id_px FROM 
    (SELECT id_px , CONCAT('-,' , GROUP_CONCAT(id_category),',') as gr 
    FROM my_table 
    GROUP BY id_px 
) as tbl 
    WHERE 
     INSTR(tbl.gr , ',1,' )>0 
    AND INSTR(tbl.gr , ',32,')>0 
    AND LENGTH(tbl.gr)-LENGTH(REPLACE(REPLACE(tbl.gr,',1,' ,''), ',32,' ,'')) = LENGTH(CONCAT(',1,' , ',32,')) 

最後の条件

4.2-新しい可能性ワーキングクエリを:(が簡略ので、このいずれかにクエリを書き直すtbl.grから1および32を置換して低下長さは1および32列に等しい場合LENGTHを低減比較すると、わずか1及び32が存在しました

SELECT tbl.id_px FROM 
    (SELECT id_px , GROUP_CONCAT(id_category) as gr 
    FROM my_table 
    GROUP BY id_px 
) as tbl 
    WHERE 
     tbl.gr = '1,32' or tbl.gr = '32,1' 

任意のサンプルデータがなければ、これらはOKですが、問題は、正確に二つの値なしその他id_categoryを持っているid_categoryを制限している間、彼らは良い答えをしませんでしたようです。

注:これらの2つのクエリは、id_category 1,32およびおそらく他の多くのid_categoryを持ってid_pxを選択するので、これらは、この質問join

によってid_pxを選択

2 - のための許容可能な答えではありません

SELECT a.id_px FROM my_table as a LEFT JOIN my_table as b ON a.id_px = b.id_px WHERE a.id_category = 1 AND b.id_category = 32 GROUP BY a.id_px 

1- group byを使用し、id_pxで検索:

SELECT tbl.id_px FROM 
    (SELECT id_px , CONCAT('-,' , GROUP_CONCAT(id_category),',') as gr 
    FROM my_table 
    GROUP BY id_px 
) as tbl 
    WHERE 
     INSTR(tbl.gr , ',1,' )>0 
    AND INSTR(tbl.gr , ',32,')>0 
+0

最初のものは 'グループ関数の無効な使用'を投げ、希望の値を取得します。 –

+0

最初の1つ目と2つ目のアップデート!@MarvinCalderon – MohaMad

+0

そして、第3はあなたの元のクエリ@MarvinCalderon – MohaMad

関連する問題