2016-06-13 3 views
0

Я создаю CRM для себя. Моя база данных содержит четыре таблицы. В разделе моего сайта я хочу, чтобы в цикле все [примечание] и [задача] были связаны с [контактом].Показать несколько запросов sql и заказать их по timestamp

[ссылка] (Соединение контакта с задачей)

'id' 'contact_id' 'task_id' 
'1' '1' '1' 

[контакт]

'id' 'contact_name' 
'1' 'Robert' 

[задача]

'id' 'description' 'due_date' 
'1' 'Call to say hello' '2016:06:13' 

[примечание] (Примечание ссылки непосредственно к контакту)

'id' 'contact_id' 'text' 'date_entered' 
'1' '1' 'I met Robert on the weekend.' '2016:06:12' 

Единственный способ, который я знаю на данный момент, - создать два отдельных запроса. Один для выбора и отображения информации о задаче ...

$contact_id_for_example = '1' 
$find_the_link = $mysqli->query("SELECT * FROM link WHERE contact_id = '$contact_id_for_example'"); 

if($find_the_link->num_rows != 0){ 

     while($link_rows = $find_the_link->fetch_assoc()) 
     { 

      $link_task_id = $link_rows['task_id']; 

      $find_the_task = $mysqli->query("SELECT * FROM task WHERE id = '$link_task_id' ORDER BY due_date"); 

       if($find_the_task->num_rows != 0){ 

        while($task_rows = $find_the_task->fetch_assoc()) 
        { 

         $task_description = $task_rows['description']; 

         echo '<li>'.$task_description.'</li>'; 

        } 
     } 

ой один для отображения информации примечания ..

$note_select = $mysqli->query("SELECT * FROM note WHERE contact_id = '$contact_id_for_example' ORDER BY 'date_entered'"); 

if($note_select->num_rows != 0){ 

    while($note_rows = $note_select->fetch_assoc()) 
    { 

     $note_text = $note_rows['text']; 

     echo '<li>'.$note_text.'</li>'; 

    } 
} 

Проблемы с моим методом является то, что приведенным выше код будет печатать все сначала выполняются соответствующие задачи, а затем все примечания ниже. Даже если первая заметка была введена/должна задолго до задания, она будет всегда печатать после задач.

Я просмотрел JOINS и не вижу, как это будет работать в этом случае из-за того, что таблица [link] соединяет таблицу [contact] и [task].

Я также искал вокруг этого сайта и других и заметил Multiple Queries., но из того, что я прочитал до сих пор, это также не решает проблему.

Вот моя попытка:

$test_contact_id = '1068'; 

$query = "SELECT * FROM link WHERE contact_id = '$test_contact_id';"; 
    $storing_link = $query->num_rows; 
    $find_task_id = $storing_link->fetch_fields(); 
    $find_task_id->task_id; 
$query .= "SELECT * FROM task WHERE id = '$find_task_id';"; 
    $storing_task = $query->num_rows; 
    $find_task_description = $storing_task->fetch_fields(); 
    $task_description->text; 
$query .= "SELECT * FROM note WHERE contact_id = '$test_contact_id';"; 
    $storing_note = $query->num_rows; 
    $find_note_text = $storing_note->fetch_fields(); 
    $note_text = $find_note_text->text; 

if($mysqli->multi_query($query)){ 

    echo '<p>'.$task_description.' :: '.$note_text.'</p>'; 

} 

ответ

2

JOIN s являются именно то, что вы хотите. Вам просто нужно немного логики, чтобы обнаружить, когда вы двигаетесь между наборами записей. например простой конечный автомат:

SELECT ... 
ORDER BY table1.foo, table2.bar, table3.baz 

$prev1 = $prev2 = $prev3 = null; 
while($row = fetch()) { 
    if ($row['table1.foo'] != $prev1) { 
    start a new table1 output 
    $prev1 = $row['table1.foo']; 
    } 
    ... repeat for tables 2&3, 
    ... output "core" data 
} 
+0

Спасибо, что посмотрю на это и вернусь. – Bjaeg

Смежные вопросы