tlistvg - таблица с данными по транспортному средству
-idn *mediumint * - идент. транспортного средства, автоинскремент
-dnakl *date* - дата накладной(по ней формируется цена в справочнике цен)
-dtinput
-brutto
-tara
-netto
- ...
транспортное средство везет несколько видов продукции.
tscrweight - таблица видов продукции и их вес в тр.средстве
idn *int* - идент.продукции, автоинскремент
listvg *mediumint* - идент. транспортного средства (idn таблицы tlistvg)
scr *smallint* - код вида продукции
scrw - ч.вес по виду
tpricezd - таблица, справочник цен по видам продукции
idn *smallint* - идент., автоинскремент
prdate *date* - дата начала дейст. цены
scr *smallint* - вид продукции((idn таблицы tscrweight)
prf - цена
Таблица справочника цен имеет вид, например:
1 20.04.2014 5 2100
2 05.04.2014 5 2300
...
3 20.04.2014 8 1950
4 06.04.2014 8 1520
...
Необходимо в одном запросе получить:
1. данные по транспортному средству (это понятно)
2. виды которые оно перевозит (и это понятно LEFT JOIN)
3. самое главное, актуальная цена вида из справочника
цен на дату отгрузки транспортного средства (это сейчас реализовано запросом в цикле.).
4.При всем при этом необходимо чтобы запрос выдавал каждой строкой по транспортному
средству, а не по видам - поэтому данные по видам групируются GROUP_CONCAT а потом разбиваются в цикле по explode.
Сейчас это реализовано таким образом:
$query_string="SELECT tlistvg.`idn`, tlistvg.`dnakl`,...,
GROUP_CONCAT(tscrweight.`scr` ORDER BY tscrweight.`idn` ASC SEPARATOR ';') AS grscr,
GROUP_CONCAT(tscrweight.`scrw` ORDER BY tscrweight.`idn` ASC SEPARATOR ';') AS grscrw
FROM `tlistvg`
LEFT JOIN `tscrweight` ON tlistvg.`idn` = tscrweight.`listvg`
GROUP BY tlistvg.`idn` ORDER BY tlistvg.`dtinput` desc";
$result_id = mysql_query($query_string, $link);
while($row = mysql_fetch_array($result_id, MYSQL_ASSOC))
{
...
$grscr=explode(';',$row['grscr']); // расбираем коды видов продукции по этому транспортному средству
$grscrw=explode(';',$row['grscrw']); // и другие данные....
foreach($grscr as $k=>$v){ // для каждого вида ищем актуальную цену(выводим все цены по виду в которых дата цены меньше или равна
.. дате накладной - так как цена формируется по накладной - и берем максимальную дату
$qstr='SELECT tpricezd.`prf' AS pricezd FROM `tpricezd`
WHERE tpricezd.`scr`='.(int)$v." AND tpricezd.`prdate`<='$prdate'
ORDER BY tpricezd.`prdate` DESC LIMIT 1";
$rid = mysql_query($qstr, $link) or die(mysql_error());
$rw = mysql_fetch_array($rid, MYSQL_ASSOC);
$pricezd=decode($rw['pricezd']);
echo '<td>',$pricezd,'</td>'; // искомая цена
}
}
Сразу возникнут вопросы:
1.почему цены нужно выбирать из справочника цен, а не ввести дополнительное поле цены в таблицу по видам?
- Потому что нужно именно так, отправок в день много, а справочник цен может перебиваться задним числом
и изменением одной цены в справочнике - изменять цены по всем отправкам с этой ценой (т.е. не нужно
постоянно перебивать цены по каждому виду в каждой отправке).
По закрытию месяца когда все цены будут отлажены, фиксируем цены уже в табличку по видам.
2. Зачем надо групировать виды по GROUP_CONCAT.
- Затем что обработка первого запроса - это многокилобайтный код...и он изначально написан
под транспортное средство - а потом добавили виды...и все другое...соответственно переписывать
весь код нет ни желания ни времени.
ВООБЩИМ ВОПРОС - можно ли как то вписать указанный в цикле запрос№2 в запрос №1.
|