簡體   English   中英

自我加入SQL查詢

[英]Self Join SQL Query

幾天前我要求解決我需要解決的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

我需要做的是顯示所有匹配Country with City和Service的寄存器。 或按國家/地區(和_aservicio As服務)訂購所有_aciudad寄存器,例如:

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可以重復)?

非常感謝!

如果您不需要meta_id和post_id,則可以刪除文本t1.post_id,t1.meta_id ,然后將SELECT更改為SELECT DISTINCT

如果你確實需要post_id,你需要告訴我們如何決定保留哪一行 - meta_id = 276或meta_id = 279 - 正如Lamak在上面的評論中指出的那樣。

編輯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_id“混合”在一起,因為不能保證具有最高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

如果這些方法都不適合您,那么您需要給我們一些額外的標准,以便我們知道如何為您完善解決方案。

因此,您將獲得具有相同meta_value的多於一行。 您想丟棄其中一些行,即使它們對其他字段有不同的值? 在SQL Server中,您可能會執行以下操作:

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

這引入了另一個計算列(x),每個meta_value(分區依據)上重新開始的每一行(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,並希望這只是為您提供了一些谷歌新功能的線索。 也許:

MySQL中的ROW_NUMBER()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM