使用循环仅显示每个DISTINCT字段值一次

时间:2011-10-05 21:43:14

标签: php mysql loops for-loop foreach

SELECT listTitle, listLength, listCmt, listDt, mBCFName, mBCLName, moAmt, moDtOff
FROM User U, Listing L, Merchant M, MerchantOffer MO
WHERE U.uID = L.uID
and L.listID = MO.listID
and M.mID = MO.mId
ORDER BY listDt DESC;

此foreach()循环

    $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    foreach($result as $row) 
    { 
    echo "<div class='listing'>";
        print '<br>Title: ' . $row['listTitle'] . '<br>Comment: ' . $row['listCmt'] . 
        '<br>Date: ' . $row['listDt'] . '<br>Offer By: ' . $row['mBCFName']. ' ' .$row['mBCLName']. '<br> for: ' . $row['moAmt'];
    echo "</div>";
    }   

产生

enter image description here

基本上我想要的是:

Title: Apple iPhone 4S (listTitle)
Days: <some day amount <listLength>
Comment: some comment <listCmt>

    Offer By: some user <mBCFName mBCLName>
    Offer:  19.99 <moAmt>
    Date: 10/03/2011 < moDtOff>

    Offer By: some user <mBCFName mBCLName>
    Offer:  19.99 <moAmt>
    Date: 10/03/2011 < moDtOff>

    Offer By: some user <mBCFName mBCLName>
    Offer:  19.99 <moAmt>
    Date: 10/03/2011 < moDtOff>

    Offer By: some user <mBCFName mBCLName>
    Offer:  19.99 <moAmt>
    Date: 10/03/2011 < moDtOff>

3 个答案:

答案 0 :(得分:1)

在我看来,您希望在相关评论之上打印listTitle作为组标题

执行此操作的一种方法是跟踪前一行的listTitle,然后仅在与当前行存在差异时才打印它。当然,您必须确保结果集按listTitle排序。

另一种方法是让一个查询获取该组标题的所有数据,然后获取另一个获取该组内容的查询。

也可能在查询中执行此操作,但这很棘手,因为您希望第listTitle条的第一条记录具有listTitle的值,而其他记录具有null的值listTitle 1}} - 直到下一个{{1}}不同。

答案 1 :(得分:0)

基于每个字段都相同(listTitle,listLength,listCmt,listDt,mBCFName,mBCLName,moAmt,moDtOff),SQL中的更改最简单

SELECT DISTINCT listTitle, listLength, listCmt, listDt, mBCFName, mBCLName, moAmt, moDtOff

如果它不相同,那么代码将如何决定显示哪些 New Balance 574男士鞋

答案 2 :(得分:0)

这不是那么容易 - 问题是要为其他字段显示什么(例如“mBCFName”字段 - “Amanda”或“John”)?

使用“分组依据”SQL语句,然后定义规则(max,min,avg,GROUP_CONCAT ...)以选择其他行 - 示例:

SELECT listTitle, min(listLength), min(listCmt), min(listDt), GROUP_CONCAT(mBCFName), min(mBCLName), min(moAmt), min(moDtOff)
FROM User U, Listing L, Merchant M, MerchantOffer MO
WHERE U.uID = L.uID
  and L.listID = MO.listID
  and M.mID = MO.mId
GROUP BY listTitle
ORDER BY listDt DESC;