2011-03-31 64 views
0

前幾天我問了一個解決一個SQL查詢,我需要工作了,我的數據是這樣的:自加入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 

我需要做的,是顯示所有的寄存器與城市和服務相匹配的國家。或ORDER BY全國所有_aciudad寄存器(和_aservicio作爲服務),是這樣的:

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 

我怎樣才能acchive僅顯示未在meta_value值複製(用於_aciudad和_aservicio只,_apais可以被複制)的記錄?

非常感謝你們!

+0

你想保留哪一行?,這是什麼標準?在你的例子中,我可以選擇'meta_id' 276或279. – Lamak 2011-03-31 17:13:17

+0

我需要顯示_apais,_aservicio,_aciudad和_aciudad必須是DISTINCT(他的值不能重複) – Alberto 2011-03-31 17:19:48

+0

是的,我明白了。但是當'a_ciudad' **被**重複時,您需要選擇一條記錄。這是什麼標準?,因爲他們將在不同的'post_id' – Lamak 2011-03-31 17:23:51

回答

1

所以你最終會得到超過1行與相同的meta_value。你想丟棄其中的一些行,即使它們對於其他字段有不同的值?在SQL Server,則可能做這樣的事情:

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

這帶來了另一個計算列(X)與越來越多的每行(按順序)重新啓動每個meta_value(按分區)。條款定義了哪些是最重要的保留/丟棄,並且您保留的是每個保留的數量是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的新東西的線索。也許:

ROW_NUMBER() in MySQL

1

如果您不需要meta_id和post_id,則可以刪除文本t1.post_id,t1.meta_id,然後將SELECT更改爲SELECT DISTINCT。正如Lamak在他上面的評論中指出的那樣,你需要告訴我們如何決定保留哪一行 - 無論是meta_id = 276還是meta_id = 279 - 如果你需要post_id,你需要告訴我們如何決定保留哪一行(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,只是希望m​​eta_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 

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

+0

這樣?: SELECT DISTINCT t1.meta_id, t1.meta_key, t1.meta_value, t2.meta_key, t2.meta_value FROM th_postmeta T1,T2 th_postmeta WHERE = t1.post_id t2.post_id AND t1.meta_key ='_apais' AND t2.meta_key ='_aciudad' ORDER BY t1.meta_key 它仍然顯示t2.meta_value記錄的重複行: - | – Alberto 2011-03-31 19:20:48

+0

@Alberto - 啊,對。我忘了meta_id。你也需要從你的選擇中擺脫出來。 – 2011-03-31 19:28:10

+0

約書亞,我解決了它。這是簡單的: SELECT DISTINCT t1.meta_id,t1.meta_key,t1.meta_value,t2.meta_key,t2.meta_value FROM th_postmeta T1,T2 th_postmeta WHERE = t1.post_id t2.post_id AND t1.meta_key =' _apais' AND t2.meta_key ='_aciudad' GROUP BY t2.meta_value 它很有魅力,非常感謝! – Alberto 2011-03-31 19:31:16