0

数日前、解決する必要のあるSQLクエリの解決策を求めました。データは次のようになります。

meta_id post_id     meta_key    meta_value
269     4   _apais               USA
270     4   _aciudad             New york
271     4   _aservicio           Pleasure

...
272     43  _apais               USA
273     43  _aciudad             Chicago
274     43  _aservicio           Fun
...
275     44  _apais               USA
276     44  _aciudad             Miami
277     44  _aservicio           Night Life

278     45  _apais               USA
279     45  _aciudad             Miami
280     45  _aservicio           Sports

私がする必要があるのは、国と都市およびサービスに一致するすべてのレジスタを表示することです。または、国ごとにすべての_aciudadレジスタ(および_aservicio As service)を注文します。たとえば、次のようになります。

meta_id     post_id     meta_key    meta_value  meta_key    meta_value  meta_key  meta_value
270         7           _apais          USA     _aciudad    New York   _aservicio Pleasure
261         13          _apais          USA     _aciudad    Chicago    _aservicio Fun
276         4           _apais          USA     _aciudad    Miami      _aservicio Sports

@Ravi Gummadi次のような解決策を教えてくれました:

SELECT t1.meta_id, 
           t1.post_id, 
           t1.meta_key, 
           t1.meta_value, 
           t2.meta_key, 
           t2.meta_value 
    FROM th_postmeta t1, th_postmeta t2  
    WHERE t1.post_id = t2.post_id 
    AND t1.meta_key = '_apais'
    AND t2.meta_key = '_aciudad'
    ORDER BY t1.meta_key

そのクエリはこれを返します:

meta_id     post_id     meta_key    meta_value  meta_key    meta_value
270         7           _apais          USA     _aciudad    New York
261         13          _apais          USA     _aciudad    Chicago
276         4           _apais          USA     _aciudad    Miami
279         10          _apais          USA     _aciudad    Miami

meta_value値で複製されていないレコードのみを表示するにはどうすればよいですか(_aciudadおよび_aservicioの場合のみ、_apaisを複製できます)。

どうもありがとう!

4

2 に答える 2

1

meta_idとpost_idが必要ない場合は、テキストt1.post_id,とを削除してt1.meta_idから、に変更SELECTすることができますSELECT DISTINCT

post_idが必要な場合は、Lamakが上記のコメントで述べたように、保持する行(meta_id=276またはmeta_id=279)を決定する方法を教えてください。

編集1:

クエリでmeta_idとpost_idを保持したいが、meta_idとpost_idのどの値が保持されるかを気にしない場合は、次のようにすることができます。

SELECT
    MAX(t1.meta_id), 
    MAX(t1.post_id), 
    t1.meta_key, 
    t1.meta_value, 
    t2.meta_key, 
    t2.meta_value 
FROM th_postmeta t1, th_postmeta t2  
WHERE t1.post_id = t2.post_id 
AND t1.meta_key = '_apais'
AND t2.meta_key = '_aciudad'
GROUP BY t1.meta_key, t1.meta_value, t2.meta_key, t2.meta_value
ORDER BY t1.meta_key

このメソッドを使用して、異なるレコードからmeta_idsとpost_idsを「ブレンド」して取得する可能性があることに注意してください。これは、meta_idが最も高いレコードがpost_idも最も高くなることが保証されていないためです。また、その逆も同様です。

meta_idまたはpost_idが不要で、meta_keysとmeta_valuesだけが必要な場合は、次のように実行できます。

SELECT DISTINCT
    t1.meta_key, 
    t1.meta_value, 
    t2.meta_key, 
    t2.meta_value 
FROM th_postmeta t1, th_postmeta t2  
WHERE t1.post_id = t2.post_id 
AND t1.meta_key = '_apais'
AND t2.meta_key = '_aciudad'
ORDER BY t1.meta_key

これらの方法のどちらもうまくいかない場合は、ソリューションを改善する方法を知っているように、いくつかの追加の基準を指定する必要があります。

于 2011-03-31T17:21:15.897 に答える
1

したがって、同じmeta_valueを持つ複数の行になります。他のフィールドの値が異なっていても、これらの行の一部を破棄したいですか?SQL Serverでは、次のようなことを行うことができます。

SELECT
    ..., x = ROW_NUMBER() OVER(PARTITION BY meta_value ORDER BY meta_id )
WHERE
   x <= 1

これにより、別の計算列(x)が導入され、各meta_value(partition by)で再開する各行(order by)の数が増加します。このorder by句は、保持/破棄することが最も重要なものを定義しwhere、それぞれをいくつ保持するかを定義します。

meta_id     post_id     meta_key    meta_value  meta_key    meta_value   x
261         13          _apais          USA     _aciudad    Chicago      1
270         7           _apais          USA     _aciudad    New York     2
276         4           _apais          USA     _aciudad    Miami        3
279         10          _apais          USA     _aciudad    Miami        4
280         10          _apais          ABC     _aciudad    Miami        1
281         10          _apais          ABC     _aciudad    Miami        2

MySqlにタグを付けたと思います。私は実際にはMySQLを使用していません。これが、Googleにとって新しい何かの手がかりになることを願っています。多分:

MySQLのROW_NUMBER()

于 2011-03-31T17:22:18.120 に答える