0

この問題は、過去数時間私の脳を食い尽くしています。

私は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

結果:biz、addnewdomain、12,13 biz、renewdomain、12,13 biz、transferdomain、12,13 dats all、左結合を実行しようとしましたが、biz、fizz、null、null、最後にjizz、null、nullのすべての値が得られました

どこが間違っているのかわからない

4

3 に答える 3

1

新しいユーザーや新しいユーザー向けのチュートリアルでforjoinを使用する,と、予期しない結果が生じることがよくあるので、私はいつもうんざりしています。私は、他の人があなたの意図を明確に理解できるように、あなたが探しているそのタイプの参加を明示的に述べることを大いに信じています。これを試して:

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
于 2013-01-18T16:59:44.803 に答える
1

私はあなたの問題を解決したと思います。そして最良の部分は、クエリに問題がないことです。;-)クエリでタイプミスをしただけです。それは誰にでも起こります。

m.tld、p.action、p.sale * s * _price、p.cost_price from domain_pricing as p、domain_mapping as m where 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

ところで、なぜアクションに列挙型が必要になるのかわかりませんか?代わりに、主キーに整数列を使用することをお勧めします。

于 2013-01-19T14:53:34.083 に答える
0

あなたが説明する結果を得るには、CROSSJOINが必要です。

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

これはデカルト積と呼ばれ、結合条件を意図的に省略して、一方のテーブルのすべての行がもう一方のテーブルのすべての行にマップされるようにします。MySQLはこれを完全結合とも呼びます。

于 2013-01-18T16:57:26.203 に答える