Отображать каждое значение поля DISTINCT только один раз, используя цикл

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>"; } 

производит:

введите описание изображения здесь

В основном я хочу:

 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> 

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

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

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

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

Исходя из того, что каждое поле одинаковое (listTitle, listLength, listCmt, listDt, mBCFName, mBCLName, moAmt, moDtOff), изменение проще всего в SQL

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

Если это не одно и то же, то каким образом код сможет решить, какую новую весеннюю обувь 574 показать?

Это не так просто – вопрос в том, что показать для другого поля (например, поле «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;