当INNER JOIN表时,如何重写列

时间:2016-10-29 11:08:46

标签: mysql sql

我试图了解内部联接是如何工作的,而我正在研究这个例子

在这个例子中,我有三个表

// people table
|people_id | people_name |
| 1        | Foo         |
| 2        | Bar         |
//orders table
| order_id | people_id | order_title   |
|   1      |   1       | First_title |
|   2      |   2       | second_title|
|   3      |   2       | Third_title |
//items table
| item_id |order_id | people_id | title  |
|   1     |   1     |   1       | Apple  |
|   2     |   1     |   1       | Pear   |
|   3     |   2     |   2       | Apple  |
|   4     |   3     |   2       | Orange |
|   5     |   3     |   2       | Coke   |
|   6     |   3     |   2       | Cake   |

我只是INNER使用查询

加入这些表
SELECT * FROM people INNER JOIN orders ON people.people_id = orders.people_id INNER JOIN items ON people.people_id = items.people_id;

我得到了以下结果

enter image description here

我无法理解。如何写第三列(order_id)和第六列(item_id)。

我的意思是order_iditem_id可能有很多可能性。例如,他们可以像这样写

                          |order_id|                    |item_id|
                          |  1     |                    |  1    |
                          |  1     |                    |  2    |
                          |  2     |                    |  3    |
                          |  2     |                    |  4    |
                          |  2     |                    |  5    |
                          |  2     |                    |  6    |
                          |  3     |                    |  3    |
                          |  3     |                    |  4    |
                          |  3     |                    |  5    |
                          |  3     |                    |  6    |

那么有人可以解释这些列是如何编写的?

1 个答案:

答案 0 :(得分:1)

SQL表和结果集表示无序集。它们没有固有的顺序。

唯一的例外是将ORDER BY添加到最外层的SELECT

您的问题似乎与结果的排序有关。如果没有ORDER BY,结果可以按任何顺序返回 - 实际上,查询的不同运行可以以不同的顺序返回结果。

所以:

SELECT *
FROM people p INNER JOIN
     orders o
     USING (pe_id) INNER JOIN
     items i
     USING (order_id)
ORDER BY order_id, item_id;

附加说明:

  • 此版本使用表别名。
  • 最好写出您想要的列,而不是使用*
  • 在这种情况下,USING子句很方便。
  • pe_iditems的出现似乎是一个糟糕的数据库设计。您应该从orders获得此值。