Php 如何在MySQL中按日期获取最新值?

Php 如何在MySQL中按日期获取最新值?,php,mysql,Php,Mysql,我有一个名为payment的表,它添加了所有的付款条目。我在付款表中有一个字段作为customer_id,它指的是customer表中的customer id 有一个名为flag的字段,我根据它们的付款状态在其中存储1或0。如果他们支付了全部金额,则标记为0,如果有余额,则标记为1 付款表中还有另一个字段,添加在上,这是一个时间戳 我想取出所有标记为1(待定付款)的客户id(在付款表中)的最新添加行 我试着像这样从付款表中取款 $rResult = mysql_query("select

我有一个名为payment的表,它添加了所有的付款条目。我在付款表中有一个字段作为customer_id,它指的是customer表中的customer id

有一个名为flag的字段,我根据它们的付款状态在其中存储1或0。如果他们支付了全部金额,则标记为0,如果有余额,则标记为1

付款表中还有另一个字段,添加在上,这是一个时间戳

我想取出所有标记为1(待定付款)的客户id(在付款表中)的最新添加行

我试着像这样从付款表中取款

   $rResult = mysql_query("select * from payment  where flag='1'")
    while ($aRow=mysql_fetch_object($rResult))
        {
        //fetch out the customer id like this
$customer= $aRow->customer_id;
    $pay_quer = mysql_query("select*from payment where customer_id='$customer'");

        } 
然后像这样循环

   $rResult = mysql_query("select * from payment  where flag='1'")
    while ($aRow=mysql_fetch_object($rResult))
        {
        //fetch out the customer id like this
$customer= $aRow->customer_id;
    $pay_quer = mysql_query("select*from payment where customer_id='$customer'");

        } 
我知道这是很长的一段时间。有没有比一个查询更短的方法呢?
结果也不像我预期的那样(

我不知道您的表和字段的名称,但您明白了这一点:

SELECT * 
FROM payment
JOIN customer ON payment.customer_id = customer.customer_id
WHERE payment.flag = '1'
ORDER BY payment.added_on ASC;

这将包含与付款相关的客户的所有信息,按最新的第一个排序。

我不知道您的表和字段的名称,但您得到了要点:

SELECT * 
FROM payment
JOIN customer ON payment.customer_id = customer.customer_id
WHERE payment.flag = '1'
ORDER BY payment.added_on ASC;

这将包含与客户相关的所有信息,付款按最新的第一个排序。

为什么不使用一个select语句并循环搜索结果呢

SELECT customer_id FROM payment WHERE flag='1' ORDER BY added_on DESC
希望这能让所有有余额的客户按“添加”的顺序获得余额



与下面的答案一样,您也可以添加“AND”来进一步减少结果。

为什么不使用一个select语句并循环搜索结果呢

SELECT customer_id FROM payment WHERE flag='1' ORDER BY added_on DESC
希望这能让所有有余额的客户按“添加”的顺序获得余额



与下面的答案一样,您也可以添加“AND”以进一步减少结果。

只需按select语句的顺序排列即可:

根据YourTimesTempField从付款中选择*,其中标志为“1”,客户id为“$customer”订单在此

您可以通过在TimeTemp字段后面添加“desc”或“asc”来更改订单方向


您还可以使用mysql
limit 0,1
操作符限制结果。如果这样做,就不必执行while循环。

只需对select语句排序:

根据YourTimesTempField从付款中选择*,其中标志为“1”,客户id为“$customer”订单在此

您可以通过在TimeTemp字段后面添加“desc”或“asc”来更改订单方向


您还可以使用mysql
limit 0,1
操作符限制结果。如果您这样做,就不必执行while循环。

使用此命令按添加的时间排序

  $rResult = mysql_query("select * from payment  where flag='1' ORDER BY added_on DESC");


不需要第二个查询。您已经在for循环中获得了值

使用此命令按添加的时间排序

  $rResult = mysql_query("select * from payment  where flag='1' ORDER BY added_on DESC");
SELECT p.* 
FROM 
    payment AS p
  JOIN
    ( SELECT customer_id
           , MAX(added_on) AS max_added_on
      FROM payment
      WHERE flag='1'
      GROUP BY customer_id
    ) AS g
    ON  g.customer_id = p.customer_id
    AND g.max_added_on = p.added_on
ORDER BY p.added_on DESC

不需要第二个查询。您已经在for循环中获得了值

SELECT p.* 
FROM 
    payment AS p
  JOIN
    ( SELECT customer_id
           , MAX(added_on) AS max_added_on
      FROM payment
      WHERE flag='1'
      GROUP BY customer_id
    ) AS g
    ON  g.customer_id = p.customer_id
    AND g.max_added_on = p.added_on
ORDER BY p.added_on DESC
或者(不清楚您到底想要什么,也不清楚该标志是如何使用的)。这将显示不同的结果,只有那些在
付款
中其最近一行具有
标志=1的客户:

SELECT p.* 
FROM 
    payment AS p
  JOIN
    ( SELECT customer_id
           , MAX(added_on) AS max_added_on
      FROM payment
      GROUP BY customer_id
    ) AS g
    ON  g.customer_id = p.customer_id
    AND g.max_added_on = p.added_on
WHERE p.flag='1'
ORDER BY p.added_on DESC
或者(不清楚您到底想要什么,也不清楚该标志是如何使用的)。这将显示不同的结果,只有那些在
付款
中其最近一行具有
标志=1的客户:

SELECT p.* 
FROM 
    payment AS p
  JOIN
    ( SELECT customer_id
           , MAX(added_on) AS max_added_on
      FROM payment
      GROUP BY customer_id
    ) AS g
    ON  g.customer_id = p.customer_id
    AND g.max_added_on = p.added_on
WHERE p.flag='1'
ORDER BY p.added_on DESC

Erm从付款中选择*有什么不对?如果customer_id=$customer,flag=1,那么结果不符合预期是什么意思?在您的示例中,“flag”似乎是付款表的一部分,但您的文本表明它在customer表中。它在哪里?此外,您的代码将获取所有未付款客户的所有付款,包括他们确实支付的付款。所以我有点不清楚你想要什么。@Daniel-我现在无法添加屏幕截图。.在客户id=$customer和flag=1的情况下,从付款中选择*没有错。。。但我想把最后一行添加到display@Bala_C:您能给我们看一下表中的一些示例行吗(针对一个客户)?不清楚是否只有最新的标志是
1
,或者可能有
flag=1
的旧行,然后是
flag=0
Erm从付款中选择*有什么问题,其中customer_id=$customer和flag=1,您的示例中,“flag”似乎是付款表的一部分,但您的文本表明它在customer表中。它在哪里?此外,您的代码将获取所有未付款客户的所有付款,包括他们确实支付的付款。所以我有点不清楚你想要什么。@Daniel-我现在无法添加屏幕截图。.在客户id=$customer和flag=1的情况下,从付款中选择*没有错。。。但我想把最后一行添加到display@Bala_C:您能给我们看一下表中的一些示例行吗(针对一个客户)?不清楚是否只有最新的标志是
1
,或者可能有
flag=1
的旧行,然后是
flag=0
的新行。它只是按照添加的方式对表格进行排序,但我需要最后添加的工资,正如Grrbrr404所说,您可以在最后使用限制0,1来获取最新的工资。它只是按照添加的方式对表格进行排序,但我需要最后添加的工资,正如Grrbrr404所说,您可以在最后使用限制0,1获取最新信息。