2011-02-04 2 views
0

私は約15列のテーブルを持っています。私ができるようにしたいのは、ある範囲のIDを選択して、私に提示された同じ列データをすべて持っていることです。分でSQLは同じ列のデータを見つける

は、私はそれには、以下のように構成されている:

SELECT id, col_a, col_b ... count(id) 
FROM table 
GROUP BY col_a, col_b ... 

をすべての行内で同一のデータを持って一緒にグループ化された行を返す - 私が欲しいものの半分ですが、理想的に私はしたいと思われます(行IDごとに同じであれば)値を持つ単一の行を取得するか、または単一の違いがある場合はNULLを取得できます。

私はそれが可能であるかどうかはわかりませんが、SQLクエリで実行可能かどうかは、PHPのループロジックを記述して各行の類似性を確認するよりもむしろ参照してください。

おかげで、

ダン

UPDATE:

ただ、これは最新に保つためには、私が重複して、表示している見つけるだろうPHP関数を記述することによって、問題を通して働いていました違い。しかし、私は今から各列のテーブルを作成し、その列を他のテーブルへの参照として作成しました。

E.G. MainTableで、コーラは今、私はまだ、私はそれはまだ、上記の問題を残してと思うが、少なくとも今Imは重複した情報を格納していない主として、当分の間、PHPの問題を解決していますテーブルコーラ

を指し、 。

+0

あなたは、データベースのアーキテクチャをリファクタリングべきではない場合、私は疑問に思う:

そしてここでは、可能なパターンですか?リレーショナルデータベースを持つという考えは、同じデータを別の場所に格納するのを防ぐことです。しかし、そのようなことをするための完全に正当な理由があるかもしれません。ユーザー入力は気になりますが、データをdbに格納する前に検証します。 – Peter

+0

これは画像ライブラリに基づいており、各画像には関連付けられたデータがあります。いくつかの画像は同じデータを共有し、複数の画像のデータを編集する場合、私はそれを行う人が「同じ」すべての情報を表示したいと思っています。 – Dan

+0

実際のテーブル構造と実際のデータの例は非常に高く評価されます。現時点では、あなたのテーブルは大きな構造上の欠陥や誤解に苦しんでいるようです。 –

答えて

0

そのに行うための毛深いものを動作するはずですが、あなたはと同様にそれを行うことができ答えますデビッドMartenssonからの提案どのように、私はしかし、このようにそれを記述します。

Select a.id, a.col1, a.col2, a.col3 
FROM myTable a, myTable b 
WHERE a.id != b.id 
and a.col1 = b.col1 
and a.col2 = b.col2 
and a.col3 = b.col3 

あなたに一意であるidを与えるだろうが、各結果は同じ値を持っているであろうとしかし、RDBMSモデルをよりうまく利用できるように、代替データ構造を検討すべきであるというご意見の一部のコメント者には同意します。 、ID

表名attrId:

テーブル名:MyTableIds フィールズその場合、あなたは、2つのテーブルを持っているしたいattrId、ATTR1、ATTR2、attr3、電気ショック療法

で:MyTableAttrs フィールドを一般的に、複数のレコードに対して複製されるデータがある場合は、それを2番目のテーブルにプルして関係を作成し、複製データを1回だけ保存してからそれを複数回参照する必要があります。

0

によってグループとのサブクエリに参加してください:外はすべての行を選択しますその方法

SELECT a.id, b.col_a, b.col_b ... b.count) 
FROM table a 
LEFT JOIN (
    SELECT id, col_a, col_b ... count(id) "count" 
    FROM table GROUP BY col_a, col_b ... 
)b on a.id = b.id 

あなたはまだグループにしたい場合は、代わりに

SELECT id, col_a ... 
WHERE id NOT IN ("SUBQUERY WITH GROUP BY") 
UNION 
"SUBQUERY WITH GROUP BY" 

ない素敵なソリューションをUNIONを使用することができますが、それは

0

私はあなたの質問をどのように理解しているかのように思われます。

SELECT 
    /* GROUP BY columns */ 
    col_A, 
    col_B, 
    ... 

    /* aggregated columns */ 
    CASE MIN(col_M) WHEN MAX(col_M) THEN MIN(col_M) ELSE NULL END, 
    CASE MIN(col_N) WHEN MAX(col_N) THEN MIN(col_N) ELSE NULL END, 
    ... 
    COUNT(...), 
    SUM(...), 
    WHATEVER(...), 
    ... 
FROM ... 
GROUP BY col_A, col_B, ... 
+1

WHATEVER()が含まれているテーブルを参照すると、暗黙的に実装されます。 SELECT句にGROUP BY句にない列があるときに実行される関数です。 (咳) –

+0

@キャットコール:実際にはい、あなたは正しいです、ありがとう!どういうわけか、私が任意の集合体のためにその盲目的な名前を作り上げていたとき、それは私の心を横切っていませんでした。私は次回より注意する必要があります。 –

関連する問題