2013-01-18 28 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

相关问题