多行返回相同的ID,只需要一行

时间:2013-03-20 15:23:04

标签: mysql sql

我想在页面上列出几个产品。我的查询返回相同产品的倍数,我试图找出如何仅使用我的查询将其限制为一个。

我们称之为table_one的第一个表上的主键是ID。 第二个表有一列ProductID,它引用table_one上的主键。

我的查询带回了我的ProductID的倍数,等于下面的6。我只想要一个结果被带回来,但我仍然希望我在table_two上的DateReserved中的所有数据都被查询。很确定我需要在我的查询中再添加一个东西,但我没有太多运气。

我想要的结果如下。

ID   Productname  Quantity              Image       Date Reserved         SumQuantity

6    productOne          6        'image.jpg'          03-31-2013                   3           
7    productTwo          1      'product.jpg'          04-04-2013                   1  

这是我的第一张桌子。 table_one

ID   Productname  Quantity              Image

6    productOne          6        'image.jpg'                 
7    productTwo          1      'product.jpg'

这是我的第二张桌子。 table_two

ID     ProductID       DateReserved  QuantityReserved

1             6          03-31-2013                 3                 
2             6          04-07-2013                 2
3             7          04-04-2013                 1

以下是我正在尝试使用的查询。

SELECT * 
FROM `table_one` 
LEFT JOIN `table_two` 
       ON `table_one`.`ID` = `table_two`.`ProductID` 
WHERE `table_one`.`Quantity` > 0  
      OR `table_two`.`DateReserved` + INTERVAL 5 DAY <= '2013-03-27' 
ORDER BY ProductName

3 个答案:

答案 0 :(得分:1)

很抱歉发布了另一个答案,但似乎我的第一次尝试不太好;)

要在每个预订中只获得一个结果行,您需要以某种方式对它们进行总结。 首先,我建议您在结果中明确选择要返回的列,不要使用“*”。

我建议你尝试这样的事情:

SELECT
        `table_one`.`ID`, `table_one`.`Productname`, `table_one`.`Image`, `table_one`.`Quantity`,
        `table_two`.`ProductID`, SUM(`table_two`.`QuantityReserved`)
    FROM
        `table_one` 
    LEFT JOIN
        `table_two` ON `table_one`.`ID` = `table_two`.`ProductID` 
    WHERE
        `table_one`.`Quantity` > 0  
        OR `table_two`.`DateReserved` + INTERVAL 5 DAY <= '2013-03-27'
    GROUP BY `table_two`.`ProductID`
    ORDER BY ProductName

如您所见,我使用“SUM”来获取合并数量,这称为聚合,“GROUP BY”可帮助您摆脱同一ProductID的多次出现。

您现在遇到的一个问题是,您必须从单独的查询中获取预订日期(至少我现在不确定如何将其置于相同的查询中)

答案 1 :(得分:0)

因为您使用的是MySQL

LIMIT <NUMBER>

应该完全按照自己的意愿行事,你只需在ORDER BY子句后面插入它,但是你可能还应该再增加一个顺序,这样你就可以确保你总是得到你想要的那个实体而不是只是一些“随机”实体;)

因此,如果没有进一步的排序,您的查询将如下所示:

SELECT
    *
FROM `table_one` 
LEFT JOIN `table_two` ON `table_one`.`ID` = `table_two`.`ProductID` 
WHERE
    `table_one`.`Quantity` > 0
    OR `table_two`.`DateReserved` +  INTERVAL 5 DAY <= '2013-03-27'
ORDER BY ProductName
LIMIT 1

here some more description about that

答案 2 :(得分:0)

SELECT a.member_id,a.member_name,a.gender,a.amount,b.trip_id,b.location 
FROM tbl_member a
LEFT JOIN (SELECT trip_id, MAX(amount) as amount FROM tbl_member GROUP BY trip_id ) b ON a.trip_id= b.trip_id 
  LEFT JOIN tbl_trip b ON a.trip_id=c.trip_id  
ORDER BY member_name