Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn lồng nhau PHP, MYSQL

Tôi đã thực hiện truy vấn Gordons đơn giản hơn một chút. Nó hiện đáp ứng chính xác yêu cầu của bạn.

SELECT
    `name`
FROM 
    (
        (SELECT 'project' as `type`, `name`, `id` as `projectid` FROM `Project`)
        UNION ALL
        (SELECT 'todo' as `type`, `name`, `projectid` FROM `Todo`)
    ) as `combined`
ORDER BY
    `project_id`, `type`

PHP để chỉ lấy danh sách tất cả các hàng:

$q = $db->query("SELECT `name` FROM ((SELECT 'project' as `type`, `name`, `id` as `project_id` FROM `projects`) union all (SELECT 'todo' as `type`, `name`, `project_id` FROM `todos`)) as `combined` ORDER BY `project_id`, `type`");

while($row = $q->fetch_object()) {
    echo $row->name . '<br />';
}

PHP để nhận danh sách lồng nhau với truy vấn 'phức tạp':

$q = $db->query("SELECT `name`, `type` FROM ((SELECT 'project' as `type`, `name`, `id` as `project_id` FROM `projects`) union all (SELECT 'todo' as `type`, `name`, `project_id` FROM `todos`)) as `combined` ORDER BY `project_id`, `type`");

echo '<ul>';

$needToBeClosed = false;

while($row = $q->fetch_object()) {
    if($row->type == 'project' AND $needToBeClosed) {
        echo '</ul></li>';
        $needToBeClosed = false;
    }

    echo '<li>' . $row->name;

    if($row->type == 'project') {
        echo '<ul>';
        $needToBeClosed = true;
    } else {
        echo '</li>';
    }
}

if($needToBeClosed) {
    echo '</ul></li>';
}

echo '</ul>';

Nhưng như bạn có thể thấy, bạn càng cố gắng thực hiện nhiều hơn trong truy vấn của mình. Càng cần nhiều PHP để sử dụng nó một cách đơn giản. Vì vậy, bạn cần tìm sự cân bằng giữa SQL và PHP để có được mã đẹp nhất. Thông thường tôi sẽ không thực hiện phương pháp trên mà chỉ thực hiện nhiều truy vấn như sau:

PHP để nhận danh sách lồng nhau mà không có các truy vấn 'phức tạp':

$projects = $db->query('SELECT * FROM `projects`');

echo '<ul>';

while($project = $projects->fetch_object()) {
    echo '<li>' . $project->name . '<ul>';
    $todos = $db->query('SELECT * FROM `todos` WHERE `project_id` = ' . $project->id);

    while($todo = $todos->fetch_object()) {
        echo '<li>' . $todo->name . '</li>';
    }

    echo '</ul></li>';
}

echo '</ul>';

Bạn vẫn cần sửa đổi các truy vấn cho nhu cầu của riêng mình (tên bảng, v.v.).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL kiểm tra xem hai phạm vi ngày có trùng lặp với đầu vào không

  2. google maps api infowindow nhiều điểm đánh dấu, cùng một vị trí

  3. mysql tìm kiếm catid trong trường văn bản

  4. Cách sắp xếp các hàng của bảng HTML được gọi từ MySQL

  5. Cách tạo người dùng trong MySQL