显示多个SQL查询并按时间戳排序

时间:2016-06-13 14:44:12

标签: php mysql mysqli

我正在为自己创建一个CRM。我的数据库包含四个表。在我的网站的一个部分中,我想循环所有连接到[联系人]的[注释]和[任务]。

[link](将联系人链接到任务)

'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'

[note](注意直接链接到联系人)

'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>';

    }
}

我的方法的问题是,上面的代码会打印所有匹配的任务,然后是下面的所有注释。即使第一个音符在任务之前输入/应该完成,它们也总是在任务之后打印。

由于连接了[contact]和[task]表的[link]表,我已经查看了JOINS,并且看不出在这种情况下如何工作。

我也搜索了这个网站和其他人,并注意到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>';

}

1 个答案:

答案 0 :(得分:2)

JOIN完全是你想要的。您只需要一些逻辑来检测何时在记录集之间移动。例如一个简单的状态机:

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
}