表1中每个值的mysql从表2中获取所有值

时间:2013-01-18 16:54:14

标签: mysql

过去几个小时,这个问题正在吞噬我的大脑。

我有两张桌子:

**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

无法弄清楚我哪里出错了

3 个答案:

答案 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还将其称为完全连接