2013-01-18 27 views
0

這個問題在過去的幾個小時裏吃掉了我的大腦。表1中的每個值的mysql獲取表2中的所有值

我有2個表:

**domain_pricing** 
action enum() 
map varchar(10) 
cost_price varchar(10) 
sale_price varchar(10) 

**domain_mapping** 
map varchar(10) 
tld varchar(10) 

地圖是兩個表常見。 樣本數據:

**domain_pricing** 
addnewdomain,dotbiz,12,13 
renewdomain,dotbiz,12,13 
transferdomain,dotbiz,12,13 

**domain_mapping** 
dotbiz,biz 
dotbiz,fizz 
dotbiz,jizz 

我需要什麼之後加入:

biz,addnewdomain,12,13 
biz,renewdomain,12,13 
biz,transferdomain,12,13 
fizz,addnewdomain,12,13 
fizz,renewdomain,12,13 
fizz,transferdomain,12,13 
jizz,addnewdomain,12,13 
jizz,renewdomain,12,13 
jizz,transferdomain,12,13 

我的查詢:

select m.tld,p.action,p.sales_price,p.cost_price from domain_pricing as p, domain_mapping as m where p.map=m.map 

結果: 商務,addnewdomain,12,13 商務,renewdomain,12 ,13 biz,transferdomain,12,13 dats all,試着做左連接但是給了biz所有的值然後f伊茨,NULL,NULL最後的jizz,NULL,NULL

想不通我要去哪裏錯了

+1

Eh?你的查詢[作品](http://sqlfiddle.com/#!2/f0689/1/0)對我來說。 – eggyal

+0

你是對的,我的varchar限制削減了我忽視的大地圖值,這導致了不正確的映射。將此問題標記爲要刪除的模塊。 – Suyash

+1

或者,如果其他人將來遇到類似問題,可以將其作爲您自己問題的答案發布? – eggyal

回答

1

我覺得解決了你的問題。最好的部分是你的查詢沒有問題。 ;-)你只是在你的查詢中犯了一個錯字。這發生在每個人身上。

選擇m.tld,p.action,p.sale * 小號 * _price,從domain_pricing爲p,domain_mapping爲m p.cost_price其中p.map = m.map

它應該是:

select m.tld,p.action,p.sale_price,p.cost_price from domain_pricing as p, domain_mapping as m where p.map=m.map 

不同的是,你的查詢會尋找不存在的列銷售* 小號 *。你想要的列是銷售。

CREATE TABLE domain_pricing (
    action enum('addnewdomain','renewdomain','transferdomain') primary key, 
    map varchar(10), 
    cost_price varchar(10), 
    sale_price varchar(10) 
); 

CREATE TABLE domain_mapping(
    map varchar(10), 
    tld varchar(10) 
); 

INSERT INTO domain_pricing (action, map, cost_price, sale_price) 
VALUES 
('addnewdomain','dotbiz',12,13), 
('renewdomain','dotbiz',12,13), 
('transferdomain','dotbiz',12,13); 

INSERT INTO domain_mapping (map,tld) 
VALUES 
('dotbiz','biz'), 
('dotbiz','fizz'), 
('dotbiz','jizz'); 

SELECT * FROM domain_pricing; 

SELECT * FROM domain_mapping; 

select m.tld,p.action,p.sale_price,p.cost_price from domain_pricing as p, domain_mapping as m where p.map=m.map; 


select m.tld,p.action,p.cost_price, p.sale_price, from domain_pricing as p, domain_mapping as m where p.map=m.map; 

看到它在行動:http://www.sqlfiddle.com/#!2/f6b83/7

B.T.W.我不確定你爲什麼需要枚舉行動?我建議改爲使用主鍵的整數列。

+0

感謝您的努力,我真的很感激它,我需要枚舉,因爲那裏只有3個值。而且我的查詢很好,只是我很傻,並且保持varchar長度爲10,並且它不接受更大的值,使得我提取的結果不完整,導致我認爲提取的結果不完整。 – Suyash

+0

@Suyash聽說你可以自己解決並感謝你接受我的答案。 –

0

爲了讓你描述你的結果需要一個CROSS JOIN。

SELECT m.tld, p.action, p.cost_price, p.sale_price 
FROM domain_mapping m 
CROSS JOIN domain_pricing p 

這就是所謂的笛卡爾積,在那裏你特意請假出來的加入條件,這樣從一個表中的所有行被映射到另一個表中的所有行。 MySQL也稱這是一個完全加入

+0

「* map對於兩個表*都是通用的」,與OP的查詢「p.map = m.map」中的過濾器一起,建議OP在* CROSS JOIN後不* * ,在上面的例子中,它們產生相同的結果,因爲'map'的所有值都是相同的)? – eggyal

+0

交叉連接給出了所有值的交叉,我只想交叉tld和動作,其中映射是常見的 – Suyash

1

當我看到新用戶或新用戶教程使用,進行連接時,我經常會畏縮,因爲它經常會產生他們不期望的結果。我非常相信你明確表達了你正在尋找的那種類型的聯合,以便其他人清楚地理解你的意圖。試試這個:

SELECT m.tld,p.action,p.sales_price,p.cost_price 
FROM domain_pricing AS p 
INNER JOIN domain_mapping AS m WHERE p.map=m.map 
+0

爲什麼應該期望這個查詢與OP的原始結果不同? – eggyal

相關問題