假设您有2个表,例如tbCostumers和tbOrders。 我想显示一个包含所有客户,相关订单的摘要列表,并用分页器显示它们。
进行加入我可以提取每个客户的客户名单和所有订单,结果如下:
idCostumer | name | ... | idProduct | productName | price | ...
如果客户有超过1个订单,前n列全部相等。所以我可以:
1 | will | ... | 12 | product1 | 123 | ...
2 | bill | ... | 23 | product2 | 321 | ...
2 | bill | ... | 24 | product3 | 231 | ...
等等
我尝试使用LIMIT
仅提取n条记录并将其与分页符一起使用。
第一个问题:如果客户有超过1个订单,使用此查询我会看到n个记录,在第一列中相等(id,name,...和其他客户信息)但最后不同,哪里有产品信息。这是正确的吗?有没有其他方法来提取这些信息?
第二个问题:如果我这样做并使用LIMIT
,我可以"切割"表示同一客户的2个(或更多)记录之间的结果表;所以,例如在上面的小表中,如果我用2限制,第三行将会丢失,即使它是上面一行的一部分,因为它只是同一客户的另一个订单。
我想限制不同的idCostumer的数量,以便准确地服用n个costumers,即使它们在结果表中出现的次数超过1次。有点像n不同的idCostumer,无论它们是否重复。
这可能吗?
我希望它清楚,解释我想要达到的目标并不容易:)
谢谢!
答案 0 :(得分:0)
你可能想要这样的东西:
SELECT * FROM (
(SELECT * FROM tbCustomers LIMIT 3) AS c
INNER JOIN tbOrders AS o ON o.customer = c.idcustomer
);
您可以使用命名列替换第一个星号,并且只按您喜欢的顺序接收所需的列(即:SELECT c.name,o.price FROM ...)。
希望这适合你!
编辑:当然,更改LIMIT子句的值会更改已挑选客户的数量。
编辑2 :正如Alvaro指出的那样,您可能需要在tbCustomers查询中使用一个order子句。