есть две таблицы В таблице event хранятся события, и есть колонки id,name,start,end; в event_days_of_week есть id_event, Monday, Tuesday, Wednesday, Thursday, Friday, Suturday, Sunday в start и end содержатся дата начала и дата конца события в названиях недели содержится числа для сортировки, и если в каком то дне недели стоит 0, нам нужно его пропустить. собственно нужно выбрать все события в диапазоне сегодняшний день + 28 дней, не выбирать событие в день недели, в котором у него стоит 0, и отсортировать по дням недели. На выходе должны получить такой массив: $array[даты_дней(сегодняшний день+1,2,3...28)][индекс событий,которые вошли в этот день 0,1,2,3 и т.д.][свойства этого события id,name,start,date] решил задачу средствами php, закинув SELECT в цикл Код (Text): for($a=0;$a<28;$a++){ $day_of_week = date('l', mktime(0,0,0, date('m'),date('d')+$a, date('Y'))); $date = date('Y-m-d', mktime(0,0,0, date('m'),date('d')+$a, date('Y'))); $query = 'SELECT e.id,e.name FROM event e ' . 'INNER JOIN event_days_of_week d ON d.event_id=e.id ' . 'WHERE e.start <= ADDDATE(CURDATE(),?) AND e.end >= ADDDATE(CURDATE(),?) ' . 'AND d.'.$day_of_week.' != 0 ' . 'ORDER BY d.'.$day_of_week ; $array = array('ii',$a,$a); $result[$date] = $this->get_data($query, 'assoc', $array); } var_dump($result); и одним запросом Код (Text): $mysqli = new mysqli(parent::SERVER,parent::USER,parent::PASS,parent::DB); $mysqli->query("DROP PROCEDURE IF EXISTS get_events"); $query = 'CREATE PROCEDURE get_events() BEGIN DECLARE i INT DEFAULT 0; DECLARE week_day VARCHAR(10); WHILE i<28 DO SET week_day = DAYNAME(ADDDATE(CURDATE(),i)); SET @query:=CONCAT(" SELECT e.id,e.name,e.text,e.time,e.importance FROM event e INNER JOIN event_days_of_week d ON d.event_id=e.id WHERE e.start <= ADDDATE(CURDATE(),",i,") AND e.end >= ADDDATE(CURDATE(),",i,") AND d.",week_day," != 0;"); PREPARE query FROM @query; EXECUTE query; DEALLOCATE PREPARE query; SET i = i + 1; END WHILE; END'; $mysqli->query($query); $mysqli->multi_query('CALL get_events()'); $a=0; do { if ($res = $mysqli->store_result()) { $date = date('Y-m-d(l)', mktime(0,0,0, date('m'),date('d')+$a, date('Y'))); while($row = $res->fetch_assoc()){ $data[$date][] = $row; } $res->free(); $a++; } else { if ($mysqli->errno) { echo "Не удалось получить результат на клиенте: (" . $mysqli->errno . ") " . $mysqli->error; } } } while ($mysqli->more_results() && $mysqli->next_result()); var_dump($data); какой из вариантов предпочтительней, и почему?? или можно как то сделать по другому?
бывает! я наверно не правильно описал... у разных событий в поле День недели, разные числа по ним и надо сортировать например имеем строчки id = 1, name = event, start = 2015.02.10, end 2015.03.15, Monday = 1, Tuesday = 2, Wednesday = 2, Thursday = 2, Friday = 0, Suturday = 0, Sunday = 0, и строчку №2 id = 2, name = event_2, start = 2015.02.12, end 2015.04.15, Monday = 2, Tuesday = 3, Wednesday = 1, Thursday = 1, Friday = 1, Suturday = 1, Sunday = 1 это все нужно вывести так, что бы на сегодняшний день среда вывелось только первое событие(так как 2ое событие начинается с 2015.02.12), на второй день - четверг вывелось первое и второе событие(при том, что бы с начало было второе событие, то есть ORDER BY Thursday), через день -пятница вывелось только второе событие(так как в первом Friday = 0), и т.д.... а потом с этого всего составить таблицу по дням недели - Пн, Вт,СР.. и т.д. допустим на 4ре недели вперед.
тогда проще выбрать все по дате, а таблицу отрисовать в пхп уже проходясь по всему списку каждый день
изначально так и думал сделать, но потом задался целью сделать все средствами mysql, в учебных целях)