我试着从他们的参考手册中学习mysql。这是一个例子表。
MariaDB [menagerio]> select * from shop;
+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
| 0001 | A | 3.45 |
| 0001 | B | 3.99 |
| 0002 | A | 10.99 |
| 0003 | B | 1.45 |
| 0003 | C | 1.69 |
| 0003 | D | 1.25 |
| 0004 | D | 19.95 |
+---------+--------+-------+
7 rows in set (0.00 sec) 还有这样的查询。
MariaDB [menagerio]> select s1.article s1aritle, s1.dealer s1dealer,
s1.price s1price, s2.article s2article, s2.dealer s2dealer, s2.price
s2price from shop s1
left join shop s2 on s1.price < s2.price where s2.article is not null;
+----------+----------+---------+-----------+----------+---------+
| s1aritle | s1dealer | s1price | s2article | s2dealer | s2price |
+----------+----------+---------+-----------+----------+---------+
| 0003 | B | 1.45 | 0001 | A | 3.45 |
| 0003 | C | 1.69 | 0001 | A | 3.45 |
| 0003 | D | 1.25 | 0001 | A | 3.45 |
| 0001 | A | 3.45 | 0001 | B | 3.99 |
| 0003 | B | 1.45 | 0001 | B | 3.99 |
| 0003 | C | 1.69 | 0001 | B | 3.99 |
| 0003 | D | 1.25 | 0001 | B | 3.99 |
| 0001 | A | 3.45 | 0002 | A | 10.99 |
| 0001 | B | 3.99 | 0002 | A | 10.99 |
| 0003 | B | 1.45 | 0002 | A | 10.99 |
| 0003 | C | 1.69 | 0002 | A | 10.99 |
| 0003 | D | 1.25 | 0002 | A | 10.99 |
| 0003 | D | 1.25 | 0003 | B | 1.45 |
| 0003 | B | 1.45 | 0003 | C | 1.69 |
| 0003 | D | 1.25 | 0003 | C | 1.69 |
| 0001 | A | 3.45 | 0004 | D | 19.95 |
| 0001 | B | 3.99 | 0004 | D | 19.95 |
| 0002 | A | 10.99 | 0004 | D | 19.95 |
| 0003 | B | 1.45 | 0004 | D | 19.95 |
| 0003 | C | 1.69 | 0004 | D | 19.95 |
| 0003 | D | 1.25 | 0004 | D | 19.95 |
+----------+----------+---------+-----------+----------+---------+ 我的问题是,我试图加入到商店表中来比较它们的价格,但是当我在主表中有7行时,我无法理解为什么这个表的结果是21行&这里到底发生了什么。有人能帮我理解一下吗?
发布于 2018-04-22 09:26:14
您正在将第一个表(shop)上的所有元素与价格高于第一个元素的第二个表(shop )的元素连接起来,并且它们的代码它不是空的(您不需要这样做,因为没有空代码的文章),所以:
文章代码0001和经销商与所有其他人建立关系的一种尝试:
现在,您必须对所有其他文章进行同样的操作,以查看它们是否匹配。
编辑
对于你的第一行:
0003 \x{e76f}B\x{e76f}\x{e76f} 3.45
第0003条、经销商B和价格1.45与第0001条、经销商A和价格3.45相匹配,因为第一元素的价格(1.45)低于第二元素的价格(3.45),第二元素的物品id (0001)不为空。
新编辑
为什么这是第一排??因为你没有使用ORDER。在SQL中,如果不使用ORDER,结果集的顺序是不可预测的,因此您得到的第一行是系统创建的与条件匹配的第一行。这个顺序取决于几个因素(您做了多少次插入和删除,之前做了什么,它在内存中的文件块,您创建的索引等等)。如果您需要订单中的结果,则必须使用order BY
发布于 2018-04-22 08:49:12
请参见最右边的列,它包含所有的价格值。基本上,这里发生的是表中价格最低的行将与表中的其他行匹配。价格最高的行将不与任何其他行匹配。
因此,根据查询,您的输出是正确的。
如果这不合适,则使用equi-join。
select s1.article s1aritle, s1.dealer s1dealer,
s1.price s1price, s2.article s2article, s2.dealer s2dealer, s2.price
s2price
from shop s1
left join shop s2 on s1.article=s2.article
where s1.price < s2.price and s2.article is not null;发布于 2018-04-22 09:25:12
on s1.price < s2.price和6 + 5 + 3 + 2 + 1一样重要
s2表上有6行匹配,当s1.price = 1.25时。s2表上有5行匹配,而s1.price = 1.45则是这样。s2表上有4行匹配,当s1.price = 1.69。s2表上有3行匹配,当s1.price = 3.45。s2表中有2行匹配,当s1.price = 3.99时。s2表中有1行匹配,当s1.price = 10.99时。您可以在查询命令will eazy中添加order by s1.price以了解这一点。
select s1.article s1aritle, s1.dealer s1dealer,
s1.price s1price, s2.article s2article, s2.dealer s2dealer, s2.price
s2price
from shop s1
left join shop s2 on s1.price < s2.price
where s2.article is not null
ORDER BY s1.price您可以看到我的另一个演示示例
这是另一个例子
https://stackoverflow.com/questions/49964105
复制相似问题