Cytat(phpion @ 22.05.2015, 13:48:54 )

UNIONNa dobrą sprawę te 3 zapytania różnią się tylko częścią warunków więc możesz wyodrębnić te różnice w warunkach i wstawić je między OR'y. Będziesz jeszcze musiał się dowiedzieć z której serii warunków otrzymałeś rekord - tutaj skorzystaj z CASE w liście pobieranych kolumn.
Czyli:
1. WHERE ... AND ((jakieś warunki) OR (inne warunki) OR (i jeszcze inne))
2. SELECT ... (CASE WHEN (jakieś warunki) THEN 'timed' WHEN ... END) AS rodzaj
Póki co mam takie coś:
http://pastebin.com/5rES0JKvNie usne jak nie będę wiedzieć jak ma wyglądać takie zapytanie. Pomóżcie (IMG:
style_emoticons/default/biggrin.gif)
-------------------------------------------------- edit
Ciągle takie nieeleganckie rozwiązanie... w komentarzu na koncu opisalem problem.
<?php
namespace Scheduler\Provider;
class DataProvider {
private $db;
public function __construct($db)
{
$this->db = $db;
}
public function getTasks($userId, $date)
{
// pobieranie zadan okreslonych godzinowe i niezrobionych
$sql = "SELECT ds_tasks.`id`
, ds_tasks.`task`
, ds_tasks.`note`
, ds_priorities.`priority`
, ds_priorities.`css_class`
, ds_tasks.`date`
, ds_tasks.`time`
, ds_tasks.`done`
FROM ds_tasks LEFT JOIN ds_priorities
ON ds_tasks.`priority_id` = ds_priorities.`id`
WHERE user_id = ? AND `date` = ? AND `done` = 0 AND `time` IS NOT NULL
ORDER BY `time`";
$timed = $this->db->fetchAll($sql, array((int
) $userId, $date));
// pobieranie zadan nie okreslonych godzinowo i niezrobionych
$sql = "SELECT ds_tasks.`id`
, ds_tasks.`task`
, ds_tasks.`note`
, ds_priorities.`priority`
, ds_priorities.`css_class`
, ds_tasks.`date`
, ds_tasks.`time`
, ds_tasks.`done`
FROM ds_tasks LEFT JOIN ds_priorities
ON ds_tasks.`priority_id` = ds_priorities.`id`
WHERE user_id = ? AND `date` = ? AND `done` = 0 AND `time` IS NULL
ORDER BY `priority` DESC";
$other = $this->db->fetchAll($sql, array((int
) $userId, $date));
// pobieranie wszystkich zadan zrobionych
$sql = "SELECT ds_tasks.`id`
, ds_tasks.`task`
, ds_tasks.`note`
, ds_priorities.`priority`
, ds_priorities.`css_class`
, ds_tasks.`date`
, ds_tasks.`time`
, ds_tasks.`done`
FROM ds_tasks LEFT JOIN ds_priorities
ON ds_tasks.`priority_id` = ds_priorities.`id`
WHERE user_id = ? AND `date` = ? AND `done` = 1
ORDER BY `timestamp` DESC";
$done = $this->db->fetchAll($sql, array((int
) $userId, $date));
// laczenie wszystkich zadan w jedna tablice
'timed' => $timed,
'other' => $other,
'done' => $done
);
return $tasks;
}
// Wywoluje, w celu pobrania zadan z dnia, funkcje getTasks()
//
// jezeli podam zakres obejmujacy 14 dni wykonuje
// 42 zapytania do bazy, poniewaz getTasks() ma 3 zapytania.
//
// czy da się jakoś uszczuplic ilosc zapytan do bazy
// aby nie zmienic struktury zwracanej tablicy?
// klucze tablicy powinny pozostac takie jakie sa
//
// struktura tablicy:
// Array
// (
// [2015-05-23] => Array
// (
// [timed] => Array (zadania okreslone w czasie...)
// [other] => Array (inne zadania...)
// [done] => Array (zadania wykonane....)
// )
// [2015-05-24] => Array
// (
// [timed] => Array (-//-)
// [other] => Array (-//-)
// [done] => Array (-//-)
// )
// .
// .
// .
// .itd.
// )
public function getTimeIntervalTasks($userId, $date, $endDate)
{
$tasks[$date] = $this->getTasks($userId, $date);
}
return $tasks;
}
}
?>
Ten post edytował zielq701 22.05.2015, 21:48:02