Работа со старыми датами для нескольких столбцов

Моя таблица содержит 10 столбцов datetime ( item1item10 ), которые представляют 10 услуг, предлагаемых моими членами. В любом данном «городе / округе» доступно только 12 позиций для каждого из 10 услуг. В принципе, мне нужно двенадцать самых старых данных из каждого столбца для возврата соответственно как «item1», «item2», «item3» и т. Д., А также как «».

Элемент № отображен в списке участников, где я использую jquery для фильтрации списков.

Мой текущий код устанавливает предел, но не соответствует дате. Проблема возникает, если все позиции на странице заполнены. Старший член может затем «выбить» новых членов, если они решат предложить дополнительные услуги.

Если я не объясню это хорошо, вот рабочий пример: http://integritycontractingofva.com/pest_control/Richmond_VA.php

 $result = @mysqli_query($db, "SELECT * FROM table WHERE category LIKE '%$category%' AND territories LIKE '%$area.%' AND exp >= NOW()"); if (!$result){echo ("<p>Error performing listing query:" . mysql_error() . "</p>");} $item1cnt = $item2cnt = $item3cnt = $item4cnt = $item5cnt = $item6cnt = $item7cnt = $item8cnt = $item9cnt = $item10cnt = 0; //start counter at "0" $items = array(); $today = date('Ym-d'); while ($row = mysqli_fetch_array($result)){ if($row["exp"] > $today){ if($row["item1"]!="0000-00-00 00:00:00"){ // if datetime is set $item1cnt++; // add one to counter if($item1cnt > 12){ // if counter is greater than 12 $row["item1"]=""; // itemx = "" }else{ // if counter is less than 12 $row["item1"]="item1"; // item = itemx } }else{ // if datetime is not set $row["item1"]=""; // itemx = "" } // repeat above for all 10 items // part of member's listing used by jquery to filter services $items[] = "<li class=\"services " . $row["item1"] . " " . $row["item2"] . " " . $row["item3"] . " " . $row["item4"] . " " . $row["item5"] . " " . $row["item6"] . " " . $row["item7"] . " " . $row["item8"] . " " . $row["item9"] . " " . $row["item10"] . "\">"; } } 

Если член имеет item3 и item9 , установленное для item1 , item3 и item9 , напечатанным результатом будет <li class="services item1 item3 item9">

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

 SELECT t.*, CONCAT_WS(' ', a1.class, a2.class, ... a10.class ) AS class FROM table t LEFT JOIN (SELECT id,'item1' AS class FROM table ORDER BY item1 desc LIMIT 12) a1 ON t.id=a1.id LEFT JOIN (SELECT id,'item2' AS class FROM table ORDER BY item2 desc LIMIT 12) a2 ON t.id=a2.id ... LEFT JOIN (SELECT id,'item10' AS class FROM table ORDER BY item10 desc LIMIT 12) a10 ON t.id=a10.id 

и все это

 if($row["item1"]!="0000-00-00 00:00:00"){ // if datetime is set $item1cnt++; // add one to counter if($item1cnt > 12){ // if counter is greater than 12 $row["item1"]=""; // itemx = "" }else{ // if counter is less than 12 $row["item1"]="item1"; // item = itemx } }else{ // if datetime is not set $row["item1"]=""; // itemx = "" } // repeat above for all 10 items 

может быть написано просто так (для всех 10 элементов):

 // config $item_count = 10; $show_records = 12; // process $cnt = array_fill(1, $item_count, 0); for ($i = 1; $i <= $item_count; $i++) { $n = "item" . $i; if (!$row[$n] || $row[$n] === "0000-00-00 00:00:00" || $cnt[$i] >= $show_records) { $row[$n] = ""; } else { $cnt[$n]++; } } 

Окончательное решение:

 // === SELECTING === $result = mysqli_query($db, " SELECT t.*, CONCAT_WS(' ', a1.class, a2.class, ... a10.class ) AS classes FROM table t LEFT JOIN (SELECT id,'item1' AS class FROM table ORDER BY item1 desc LIMIT 12) a1 ON t.id=a1.id LEFT JOIN (SELECT id,'item2' AS class FROM table ORDER BY item2 desc LIMIT 12) a2 ON t.id=a2.id ... LEFT JOIN (SELECT id,'item10' AS class FROM table ORDER BY item10 desc LIMIT 12) a10 ON t.id=a10.id WHERE t.category LIKE '%$category%' AND t.territories LIKE '%$area.%' AND t.exp >= NOW() "); if (!$result){ echo ("<p>Error performing listing query:" . mysql_error() . "</p>"); exit; } // === PARSING === // config $item_count = 10; $show_records = 12; // process $cnt = array_fill(1, $item_count, 0); for ($i = 1; $i <= $item_count; $i++) { $n = "item" . $i; if (!$row[$n] || $row[$n] === "0000-00-00 00:00:00" || $cnt[$i] >= $show_records) { $row[$n] = ""; } else { $cnt[$n]++; } } // part of member's listing used by jquery to filter services $items[] = '<li class="services ' . $row['classes'] . '">'; 

PS Вы должны должным образом избегать $category и $area если это пользовательский ввод, прежде чем вводить их в SQL-запрос. Это можно сделать с помощью mysql_real_escape .