Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL内部联接意外结果_Mysql_Inner Join - Fatal编程技术网

Mysql SQL内部联接意外结果

Mysql SQL内部联接意外结果,mysql,inner-join,Mysql,Inner Join,我已经试着理解这一点将近2个多小时了,但仍然无法理解我的JOIN查询的输出 我有一个表礼物的结构 +--------+-------------------+-------+----------+--------------+ | giftid | giftname | price | discount | availability | +--------+-------------------+-------+----------+--------------+ | G101

我已经试着理解这一点将近2个多小时了,但仍然无法理解我的
JOIN
查询的输出

我有一个表
礼物
的结构

+--------+-------------------+-------+----------+--------------+ | giftid | giftname | price | discount | availability | +--------+-------------------+-------+----------+--------------+ | G101 | Magic Mug | 500 | 9 | 10 | | G102 | Golf Set | 3550 | 5 | 15 | | G103 | Little Astronomer | 2000 | 20 | 18 | | G104 | Renoir Paintings | 1500 | 15 | 15 | | G105 | French F | 3000 | 7 | 10 | | G106 | Magic Set | 1300 | 30 | 30 | +--------+-------------------+-------+----------+--------------+ 如果我更改
g1.availability=g2.availability
以比较其他列,则输出为
12行,这是预期的

有人能解释为什么不包括列值18和30吗?因为它们实际上是一样的。它是选择其他每一个重复值,但不是这两个

对同一列进行比较的自联接不应该总是返回表中所有值的
两次吗


实际上,它按预期返回了10行

只有10和15是双倍的,所以你得到了8,而18和30是唯一的,你得到了另外两行

giftid | giftname |折扣|可用性| giftid | giftname |价格|折扣|可用性 :----- | :---------------- | -------: | -----------: | :----- | :---------------- | ----: | -------: | -----------: G105 |法国F | 7 | 10 | G101 |魔术杯| 500 | 9 | 10 G101 |魔术杯| 9 | 10 | G101 |魔术杯| 500 | 9 | 10 G104 |雷诺阿绘画| 15 | 15 | G102 |高尔夫套装| 3550 | 5 | 15 G102 |高尔夫套装| 5 | 15 | G102 |高尔夫套装| 3550 | 5 | 15 G103 |小天文学家| 20 | 18 | G103 |小天文学家| 2000 | 20 | 18 G104 |雷诺阿绘画| 15 | 15 | G104 |雷诺阿绘画| 1500 | 15 | 15 G102 |高尔夫套装| 5 | 15 | G104 |雷诺阿绘画| 1500 | 15 | 15 G105 |法语F | 7 | 10 | G105 |法语F | 3000 | 7 | 10 G101 |魔杯| 9 | 10 | G105 |法式F | 3000 | 7 | 10 G106 |魔术组| 30 | 30 | G106 |魔术组| 1300 | 30 | 30 小提琴

对同一列进行比较的自联接不应该总是返回表中的所有值两次吗


否,如果联接列中的值是唯一的,则该行将联接到自身并返回一行。根据前面的回答,当联接列中存在重复值时,您只能得到更多行

请参考权威文档,清楚完整地说出您的期望值和期望值的原因。否则,你只是要求我们重写它,这太宽泛了&是重复的&我们无法解决你的误解,除了你不理解join之外,你&我们已经知道了。
SELECT g1.giftid, g1.giftname, g1.discount, g1.availability FROM gift g1 JOIN gift g2 ON g1.availability=g2.availability;
CREATE TABLE gift (
  `giftid` VARCHAR(4),
  `giftname` VARCHAR(17),
  `price` INTEGER,
  `discount` INTEGER,
  `availability` INTEGER
);

INSERT INTO gift
  (`giftid`, `giftname`, `price`, `discount`, `availability`)
VALUES
  ('G101', 'Magic Mug', '500', '9', '10'),
  ('G102', 'Golf Set', '3550', '5', '15'),
  ('G103', 'Little Astronomer', '2000', '20', '18'),
  ('G104', 'Renoir Paintings', '1500', '15', '15'),
  ('G105', 'French F', '3000', '7', '10'),
  ('G106', 'Magic Set', '1300', '30', '30');
SELECT g1.giftid, g1.giftname, g1.discount, g1.availability 
FROM gift g1 JOIN gift g2 
ON g1.availability=g2.availability;
giftid | giftname | discount | availability :----- | :---------------- | -------: | -----------: G105 | French F | 7 | 10 G101 | Magic Mug | 9 | 10 G104 | Renoir Paintings | 15 | 15 G102 | Golf Set | 5 | 15 G103 | Little Astronomer | 20 | 18 G104 | Renoir Paintings | 15 | 15 G102 | Golf Set | 5 | 15 G105 | French F | 7 | 10 G101 | Magic Mug | 9 | 10 G106 | Magic Set | 30 | 30
SELECT g1.giftid, g1.giftname, g1.discount, g1.availability , g2.*
FROM gift g1 JOIN gift g2 
ON g1.availability=g2.availability;
giftid | giftname | discount | availability | giftid | giftname | price | discount | availability :----- | :---------------- | -------: | -----------: | :----- | :---------------- | ----: | -------: | -----------: G105 | French F | 7 | 10 | G101 | Magic Mug | 500 | 9 | 10 G101 | Magic Mug | 9 | 10 | G101 | Magic Mug | 500 | 9 | 10 G104 | Renoir Paintings | 15 | 15 | G102 | Golf Set | 3550 | 5 | 15 G102 | Golf Set | 5 | 15 | G102 | Golf Set | 3550 | 5 | 15 G103 | Little Astronomer | 20 | 18 | G103 | Little Astronomer | 2000 | 20 | 18 G104 | Renoir Paintings | 15 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15 G102 | Golf Set | 5 | 15 | G104 | Renoir Paintings | 1500 | 15 | 15 G105 | French F | 7 | 10 | G105 | French F | 3000 | 7 | 10 G101 | Magic Mug | 9 | 10 | G105 | French F | 3000 | 7 | 10 G106 | Magic Set | 30 | 30 | G106 | Magic Set | 1300 | 30 | 30