Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytania zagnieżdżone PHP, MYSQL

Uczyniłem zapytanie Gordona nieco prostszym. Teraz dokładnie spełnia Twoje wymagania.

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, aby uzyskać tylko listę wszystkich wierszy:

$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, aby uzyskać zagnieżdżone listy ze „skomplikowanym” zapytaniem:

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

Ale jak widzisz, tym więcej próbujesz zrobić w swoim zapytaniu. Im więcej PHP jest potrzebne do korzystania z niego w prosty sposób. Musisz więc znaleźć równowagę między SQL i PHP, aby uzyskać najlepszy kod. Normalnie nie stosowałbym powyższego podejścia, ale po prostu wykonaj wiele zapytań w ten sposób:

PHP, aby uzyskać zagnieżdżoną listę bez „skomplikowanych” zapytań:

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

Nadal musisz zmodyfikować zapytania do własnych potrzeb (nazwy tabel itp.).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Operatory logiczne MySQL

  2. PHP Wyszukiwanie i sortowanie MySQL według trafności

  3. Jak mogę połączyć się z MySQL w Pythonie 3 w systemie Windows?

  4. Alternatywne sposoby na uniknięcie limitu geokodów w Mapach Google

  5. Problem z rake db:migrate -