首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Mysql参考手册了解mysql查询

从Mysql参考手册了解mysql查询
EN

Stack Overflow用户
提问于 2018-04-22 08:43:38
回答 4查看 61关注 0票数 0

我试着从他们的参考手册中学习mysql。这是一个例子表。

代码语言:javascript
复制
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)         

还有这样的查询。

代码语言:javascript
复制
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行&这里到底发生了什么。有人能帮我理解一下吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-04-22 09:26:14

您正在将第一个表(shop)上的所有元素与价格高于第一个元素的第二个表(shop )的元素连接起来,并且它们的代码它不是空的(您不需要这样做,因为没有空代码的文章),所以:

文章代码0001和经销商与所有其他人建立关系的一种尝试:

  1. 与其本身不匹配,因为它的价格是相等的(它应该更少)
  2. 与0001和经销商B匹配,因为它的价格更低,所以一排排
  3. 与0002和经销商A匹配,因为价格较低,并制造了一排
  4. 与0003和经销商B不计算,因为价格更高。不成一排
  5. 与0003和经销商C和D相同,与4号相同
  6. 对于第0004条和经销商D,由于价格较低,就会引起争吵。

现在,您必须对所有其他文章进行同样的操作,以查看它们是否匹配。

编辑

对于你的第一行:

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

票数 0
EN

Stack Overflow用户

发布于 2018-04-22 08:49:12

请参见最右边的列,它包含所有的价格值。基本上,这里发生的是表中价格最低的行将与表中的其他行匹配。价格最高的行将不与任何其他行匹配。

因此,根据查询,您的输出是正确的。

如果这不合适,则使用equi-join。

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2018-04-22 09:25:12

on s1.price < s2.price6 + 5 + 3 + 2 + 1一样重要

  1. s2表上有6行匹配,当s1.price = 1.25时。
  2. s2表上有5行匹配,而s1.price = 1.45则是这样。
  3. s2表上有4行匹配,当s1.price = 1.69
  4. s2表上有3行匹配,当s1.price = 3.45
  5. s2表中有2行匹配,当s1.price = 3.99时。
  6. s2表中有1行匹配,当s1.price = 10.99时。

您可以在查询命令will eazy中添加order by s1.price以了解这一点。

代码语言:javascript
复制
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

您可以看到我的另一个演示示例

这是另一个例子

方形小提琴:http://sqlfiddle.com/#!9/dd04480/4

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49964105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档