2013-01-31 56 views
2

我需要幫助已經有一段時間了,但今天我在這裏基本上從你的知識中獲得幫助。我目前很困擾一個非常惱人的SQL問題,這是以下內容。MySQL - 從多個表中選擇,可能沒有連接?

我有兩個表。繪畫和特殊項目。這兩個表都有唯一的列名稱(painteditemid,specialitemid等),但這兩個表共享相似的值。我想從兩個表中獲得結果。

比方說,這是我的設置:

PaintedItems

  • paintedItemName
  • paintedItemColor
  • 可見

SpecialItems

  • specialItemName
  • specialItemColor
  • 可見

我用這個查詢:

SELECT * 
FROM `painteditems` AS pa, 
    `specialitems` AS sp 
WHERE (pa.`visible` = 1 
     OR sp.`visible` = 1) 
    AND (pa.`painteditemname` = 'itemname1' 
     OR sp.`specialitemname` = 'itemname1') 
    AND (pa.`painteditemcolor` = 'black' 
     OR sp.`specialitemcolor` = 'black') 

這導致:

Showing rows 0 - 29 (259,040 total, Query took 39.4352 sec) 

即使這兩個表包含總共只有10.000行。添加這個沒做什麼:

GROUP BY pa.`painteditemid`, sp.`specialitemid` 

仍然260k行。我應該如何處理這個問題?

預先感謝您。

編輯:固定的間距,代碼塊

+3

你想要什麼數據?我猜你正在找'UNION'? – hank

+0

做你的表中定義的索引? – 2013-01-31 15:54:56

回答

7

聽起來確實像你想的兩個表之間的UNION

select *, 'painted' Source 
from painteditems 
where visible = 1 
    and painteditemname = 'itemname1' 
    and painteditemcolor = 'black' 
union all 
select *, 'special' Source 
from specialitems 
where visible = 1 
    and specialitemname = 'itemname1' 
    and specialitemcolor = 'black' 

您將需要更換SELECT *與列名:眼下,爲什麼結果是如此之大,你得到一個笛卡爾乘積是。此外,兩個查詢中的列數和數據類型數量必須匹配。

UNION ALL將兩個表中返回所有行,如果你只是想DISTINCT行,那麼你將要使用UNION

+0

工程就像一個魅力,謝謝。我從來沒有聽說過聯盟,哈哈。再次感謝! – Mave

+0

@歡迎您! :) – Taryn

+0

似乎有一個錯誤。如果我經過一段時間($ ar = mysql_fetch_array()){}循環,我只能從我首先放入查詢中的那一個填充。在你的情況下,我只能回顯畫圖,而不是訪問任何特殊項目。它確實創建了某種別名,因爲回顯「畫素」實際上就是「specialitemid」。 :/ – Mave

0

UNION運營商用於將結果集兩個或多個SELECT語句的結合。不利地你可以使用UNION,如@bluefeet's答案所示如果你符合以下條件。聯盟內

  • SELECT語句必須具有相同數目的 列
  • 的列還必須具有類似的數據類型
  • 在每個SELECT語句的列必須按相同的順序。
0

我會在子查詢中union all做到這一點:

select * 
from ((select paintedItemName as ItemName, paintedItemColor as ItemColor, visible, 'Painted' as which 
     from painteditems 
    ) union all 
     (select specialItemName, SpecialItemColor, visible, 'Special' as which 
     from specialitems 
    ) 
    ) t 
where visible = 1 and itemname = 'itemname1' and itemcolor = 'black' 

這可以讓你只有一個結果集。在union中,列名來自第一個子查詢,它被重命名爲更一般的名稱。我更喜歡這種方法的原因是因爲where子句不需要重複多次 - 這可能會導致錯誤和維護問題。