[英]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,並希望這只是為您提供了一些谷歌新功能的線索。 也許:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.