2012-05-20 53 views
3

我在數據庫中的這些表:MySQL實體和實體的別名:如何刪除UNION?

  • 實體(ID,姓名,刪除)
  • entities_aliases(ENTITY_ID,alias_id)
  • 別名(ID,姓名)

這個查詢是工作正常,但由於UNION緩慢,請注意entities.name如何與aliases.name交換並移至最後一列:

SELECT entities.id, entities.name, entities.deleted, NULL AS main_name 
FROM entities 
UNION 
SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name 
FROM entities 
JOIN entities_aliases ON entities_aliases.entity_id = entities.id 
JOIN aliases ON entities_aliases.alias_id = aliases.id 
ORDER BY name 

這種交換對我來說非常重要,我無法刪除它,但隨着數據庫在寬度(更多字段和鏈接)和深度(更多記錄)方面的發展,UNION會變得越來越慢。我如何擺脫聯盟?

加: 我需要的輸出。例如,我們有實體1-AAA和他的別名1-BBB和2-CCC。輸出應該是:

  • AAA
  • BBB(AAA)
  • CCC(AAA)
+0

使用左連接。 – usr

+0

如果您確定'entities.name'對於給定的'entity_id'總是不同於'ANY(aliases.name)',請使用'UNION ALL'。 – vyegorov

+0

我想問一下你期望從這個查詢中得到的輸出是什麼,這個輸出給你帶來了使用union的想法?不能說什麼適當的查詢可能是一個替代這一個雖然因爲我們不知道你期望實現什麼結果請進一步解釋你想要的結果的邏輯 –

回答

0

下面的查詢只需使用UNION ALL而不是UNION:

SELECT * 
FROM ((SELECT entities.id, entities.name, entities.deleted, NULL AS main_name 
     FROM entities 
    ) union all 
     (SELECT entities.id, aliases.name, entities.deleted, entities.name AS main_name 
     FROM entities e join 
      entities_aliases ea 
      ON ea.entity_id = e.id JOIN 
      aliases a 
      ON ea.alias_id = a.id 
    ) 
    ) e 
ORDER BY name 

UNION ALL從查詢中刪除「獨特」進程。

良好的格式*,我主觀定義爲我做事情的方式)使我更容易看到查詢。另外:

  1. 請確保entities.entity_id是實體的主鍵。
  2. 確保alias.id是別名上的主鍵。

您沒有進行任何過濾,因此entity_aliases上的外鍵關係是可選的。

+0

謝謝!但是,我需要額外的SELECT *來排序嗎?似乎沒有它,它是完美的。 –

+0

不,嚴格來說,您可以在沒有外部選擇的情況下按順序進行聯合。 –

1

我認爲你可以使用左聯接和一些國際單項實現它:

SELECT e.id, IFNULL(a.name, e.name) AS name, e.deleted, IF(a.name IS NULL, NULL, e.name) AS main_name 
FROM entities AS e 
LEFT JOIN entities_aliases AS ea ON e.id = ea.entity_id 
LEFT JOIN aliases AS a ON ea.alias_id = a.id; 

如果我明白你想要什麼,你想要的「名」是別名或實體名稱,如果沒有別名(按此順序),並且main_name在沒有別名時爲空,而在有別名時爲實體名稱。 我希望它有幫助!

+0

謝謝alghimo,但我還需要e.name作爲單獨的結果記錄,而且LEFT JOIN不會給出這個結果。我需要這樣的:AAA,BBB(AAA),CCC(AAA),其中AAA - e.name和BBB,CCC是a.name。 –

+0

也許我應該添加所有的實體名稱作爲別名,並將其與LEFT JOIN保持一致,並且如果$ name == $ main_name未在括號中顯示main_name,則在MVC的角度對其進行比較。 –