Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP, MYSQL вложени заявки

Направих заявката на Gordons малко по-опростена. Вече отговаря точно на вашите изисквания.

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, за да получите само списък с всички редове:

$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 за получаване на вложени списъци със „сложна“ заявка:

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

Но както виждате, толкова повече се опитвате да направите в заявката си. Колкото повече PHP е необходимо, за да го използвате по прост начин. Така че трябва да намерите баланс между SQL и PHP, за да получите най-хубавия код. Обикновено не бих използвал горния подход, а просто изпълнявам няколко заявки като това:

PHP за получаване на вложен списък без „сложни“ заявки:

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

Все още трябва да промените заявките за вашите собствени нужди (имена на таблици и други подобни).



  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

  2. Качване на CSV файл за обработка на актуализиране на състоянието и вмъкване на нови записи

  3. Mac OS X - EnvironmentError:mysql_config не е намерен

  4. Как да направите каскадни падащи списъци с помощта на mysql и php

  5. Ефективно присвояване на процентил/ранг в MYSQL