2011-10-18 12 views
1

I持って、次の表:MySQLでグループ化された列を検索するには? (また、休止状態で可能であれば)

Guy Table: 

+------+----------+------+ 
| guy | attribute| value| 
+------+----------+------+ 
| John | age  | 12 | 
| John | dollars | 15 | 
| John | candies | 3 | 
| Bob | age  | 15 | 
| Bob | dollars | 20 | 
| Bob | candies | 6 | 
+------+----------+------+ 

どのように私はその属性と値の条件のいずれかの種類に一致するすべての人を得ることができますか?

基本的には、gt、lt、ge、le、eq、ne、betweenなどのすべての種類の条件を使用して人とその属性を検索できるようにしたいと同時に、これらの条件を "ands "と" ors "

は例えば、私は以上の16ドルを持っているか、5つの未満キャンディーを持っている人を取得したいと言うことができますので、私はこのような何かをしようとするだろう:

select guy,attribute,value from guy group by guy having (attribute = 'dollars' and value > 16) or (attribute = 'candies' and value < 5); 

私はジョンとボブの両方を期待します代わりに空のセットが返されます(一致するものはありません)。

、それは単純なクエリで、クエリはこの1

//get guys that have more than 2 candies and also have more than 16 dollars but no matter what, don't forget to get the guys which age is exactly 12 
select guy,attribute,value from guy group by guy having ((attribute = 'candies' and value > 2) and (attribute = 'dollars' and value > 16)) or (attribute = 'age' and value = 12); 

のように複雑に得ることができ、この最後のクエリにはジョンとボブの両方を返しますが、唯一のジョンはここ

を返されている必要がありますコード表を作成し、行を追加する:

create table guy(guy varchar(255), attribute varchar(255), value int); 
insert into guy values('John', 'age', 12),('John', 'dollars', 15),('John', 'candies', 3),('Bob', 'age', 15),('Bob', 'dollars', 20),('Bob', 'candies', 6); 

は、私は後でもっと多くの人たちとより多くの属性を追加することができますが、すべての人が常に同じNUを持つことになり心を持っています

insert into guy values('Mario', 'age', 18),('Mario', 'dollars', 31),('Mario', 'candies', 10); 

を、私は属性「りんご」を追加した場合、私は、次の挿入を行うだろう:私は「マリオ」を追加した場合、属性のmberは、例えば、私は、次の挿入を行うだろう

insert into guy values('John', 'apples', 3), ('Bob', 'apples', 5), ('Mario', 'apples' 0); 

私はすべてのあなたの時間をありがとうございました、私は自分自身が理解しやすい作ら願っています:)

注:男の表には、ビューで、3つのテーブルを結合した結果であるため、データベースではない心配しないでください正規化されました。また、クエリが間違っている(私が既に知っているので)、inst私がそれらの中で何を変えるべきかを教えてください。

編集(2011年10月18日、10:08 AM):たぶん

各男のすべてを配置する方法があった場合は、次のように?,一列に属性:

+------+-----------+-------+------+------------+--------+------+------------+--------+ 
| guy | attribute | value | guy | attribute | value | guy | attribute | value | 
+------+-----------+-------+------+------------+--------+------+------------+--------+ 
| John | age  | 12 | John | dollars |  15 | John | candies |  3 | 
| Bob | age  | 15 | Bob | dollars |  20 | Bob | candies |  6 | 
+------+-----------+-------+------+------------+--------+------+------------+--------+ 
+0

私は質問に詳しい情報を入れ替え、わかりやすく理解してください。 http://stackoverflow.com/questions/7815323/search-in-grouped-columns-in-mysql – ilovelamp

答えて

2

取得します

SELECT g1.guy FROM guy g1 
INNER JOIN guy g2 ON (g1.guy = g2.guy) 
WHERE (g1.attribute = 'dollars' AND g1.value > 16) 
    OR (g2.attribute = 'candies' AND g2.value < 5) 
+0

Thx for you速い返信:) 私は彼のすべての属性で男を検索したいのですが、私は各属性の自己結合を行う必要がありますか?それは私が間違っている場合、私は30の以上の属性を持っていると私はパフォーマンスの問題があるかどうかわからない男があるので避けたいが、私を修正してくださいクエリのようなものです。 – ilovelamp

+0

@rhinojosa、はい、それぞれに参加する必要があります。あなたの記事では、これはビューであり、すでに多数の結合の結果であると言っています。単に元のデータを照会するのではなく、簡単な照会で簡単に行うことができます。 – imm

+0

すべてのテーブルのスキーマを公開しますが、新しい投稿でこれを行う必要がありますか?私は – ilovelamp

0

が..

をこのコードを試してみてください。以上16ドルを持っているか、5つの未満キャンディーを持っている人は、自己結合を使用します
+0

あなたのためのThx答え: 16ドル以上の年齢で、14歳以上の(Bobのような)人を取得したいのですが、これは動作しません:( select男、(属性=「ドル」と値> 16)と、(属性が=「年齢」と値> 14)を有する人からの属性、[値]; – ilovelamp

+0

SELECT男、属性、値から変更してみて、とOR ..男HAVING(属性=「ドル」と値> 16)** OR **(属性=「年齢」と値> 14);私はexacを持っている人を取得する必要がある場合はどのような返事:)、用 –

+0

感謝(TLY 12、15ドルと** 4 **キャンディーの年齢は、ジョンは4つのキャンディーを持っていませんが、このクエリはまだそれが '男FROM code'SELECTの男、属性、値が持つべきではありません結果としてジョンを示してい属性= '年齢'と値= 12)または(属性= 'ドルと値= 15)または(属性='キャンディーズと値= 4);この 'code'WHERE count(*)= 3'code'ですが、" OR "節を使用したいのですが? – ilovelamp

関連する問題