Отображать каждое значение поля DISTINCT только один раз, используя цикл - PullRequest
0 голосов
/ 06 октября 2011
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 ]

1 голос
/ 06 октября 2011

Мне кажется, что вы хотите напечатать listTitle как заголовок группы над соответствующими комментариями.

Один из способов сделать это - отслеживать listTitleпредыдущей строки, а затем распечатайте ее, только если есть разница с текущей строкой.Конечно, вы должны убедиться, что ваш результирующий набор упорядочен по listTitle.

Другим способом было бы иметь один запрос, который получает все данные для заголовка этой группы, а затем другой запрос, который получает содержимоегруппы.

Возможно, это также возможно сделать в запросе, но это будет сложно, так как вы хотите, чтобы первая запись с этим listTitle имела значение для listTitle, а остальные -иметь null - до следующего listTitle это не так.

0 голосов
/ 06 октября 2011

Это не так просто - вопрос в том, что показать для другого поля (например, поле "mBCFName" - "Аманда" ИЛИ "Джон")?

используйте оператор 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;
0 голосов
/ 06 октября 2011

Если все поля одинаковы (listTitle, listLength, listCmt, listDt, mBCFName, mBCLName, moAmt, moDtOff), изменение будет самым простым в SQL

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

Если оно не одинаковоеТогда как код сможет решить, какую New Balance 574 мужскую обувь отображать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...