MYSQL - 选择行直到列值不相同

时间:2017-03-29 00:06:43

标签: mysql mysqli

SELECT product.productID
    , product.Name
    , product.date
    , product.status 
FROM product 
    INNER JOIN shelf ON product.sheldID=shelf.shelfID 
WHERE product.weekID = $ID 
    AND product.date < '$day' 
    OR (product.date = '$day' AND shelf.expire <= '$time' ) 
ORDER BY concat(product.date,shelf.expire)

我试图以特定值停止SQL语句,例如坏。

我尝试过使用max-date,但是我发现它很难在查询中创建时间戳。 (结合日期/时间)

此示例表显示应返回3个结果,如果状态“bad”是第一个结果,则不应返回任何结果。 (按日期和时间排序。)

ProductID   Date     status
1        2017-03-27  Good
2        2017-03-27  Good
3        2017-03-26  Good
4        2017-03-25  Bad
5        2017-03-25  Good

更新

想想我可能已经修好了,我把它添加到我的while循环中。

查询按照现在的顺序给出过去使用日期和时间的结果,这个while循环检查该行的coloumn是否等于'bad'如果它做了什么(可能能够使用数组填充它与数据)。如果不是循环被打破。

我知道dosnt看起来很理想,但它有效lol

   while ($row = mysqli_fetch_assoc($result)) {
    if ($row['status'] == "bad") {
    $counter += 1;
    }
    else{
break;}

1 个答案:

答案 0 :(得分:1)

我将只为您的输出提供答案,就像它只是一个表一样。它将为您提供如何解决问题的主要思路。

基本上我创建了一个名为ord的列,它将作为row_number(MySql不支持AFAIK)。然后,我得到了一个糟糕状态的最小ord值,然后我从ord小于该值的数据中得到了所有内容。

select y.* 
  from (select ProductID, dt, status, @rw:=@rw+1 ord
          from product, (select @rw:=0) a
         order by dt desc) y
 where y.ord < (select min(ord) ord
                  from (select ProductID, status, @rin:=@rin+1 ord
                          from product, (select @rin:=0) a
                         order by dt desc) x
                 where status = 'Bad');

结果将是:

ProductID        dt     status  ord
-------------------------------------
1           2017-03-27   Good    1
2           2017-03-27   Good    2
3           2017-03-26   Good    3

还使用Bad状态是第一个结果的用例进行测试,不会返回任何结果。

在此处查看:http://sqlfiddle.com/#!9/28dda/1