过去几个小时,这个问题正在吞噬我的大脑。
我有两张桌子:
**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 商务,transferdomain,12,13 dats all,尝试做左连接,但是给了biz的所有值然后fizz,null,null,最后jizz,null,null
无法弄清楚我哪里出错了
答案 0 :(得分: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
答案 1 :(得分:1)
我认为解决了你的问题。最好的部分是您的查询没有任何问题。 ;-)你只在查询中输了一个错字。这发生在每个人身上。
选择m.tld,p.action,p.sale * s * _ price,将p.cost_price从domain_pricing选为p,将domain_mapping选为m,其中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
不同之处在于您查询查找非现有列销售* s *。你想要的专栏是销售。
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。我不确定为什么你需要枚举行动?我建议使用整数列作为主键。
答案 2 :(得分:0)
要获得您描述的结果,您需要一个CROSS JOIN。
SELECT m.tld, p.action, p.cost_price, p.sale_price
FROM domain_mapping m
CROSS JOIN domain_pricing p
这称为笛卡尔积,您故意省略连接条件,以便将一个表中的所有行映射到另一个表的所有行。 MySQL还将其称为完全连接。