anstatt vielen Subquerys nur ein 1 Subquery

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • anstatt vielen Subquerys nur ein 1 Subquery

    Hallo Leute,

    ich habe hier ein query welches ich bisjez nur durch subquerys geschafft habe zu realisieren^^

    Die benutzten Tabellen:

    Quellcode

    1. --
    2. -- Tabellenstruktur für Tabelle `forum_boards`
    3. --
    4. CREATE TABLE `forum_boards` (
    5. `f_board_id` int(10) unsigned NOT NULL auto_increment,
    6. `f_board_name` text NOT NULL,
    7. `f_board_over_id` int(10) NOT NULL default '0',
    8. `f_board_order` int(5) NOT NULL default '0',
    9. `f_board_info` text NOT NULL,
    10. `f_board_kategorie_id` int(10) NOT NULL,
    11. PRIMARY KEY (`f_board_id`)
    12. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    13. -- --------------------------------------------------------
    14. --
    15. -- Tabellenstruktur für Tabelle `forum_kategorien`
    16. --
    17. CREATE TABLE `forum_kategorien` (
    18. `f_kategorie_id` int(10) unsigned NOT NULL auto_increment,
    19. `f_kategorie_name` varchar(80) collate latin1_german1_ci NOT NULL,
    20. `f_kategorie_sortierung` int(10) unsigned NOT NULL,
    21. `f_kategorie_oberid` int(10) unsigned NOT NULL,
    22. PRIMARY KEY (`f_kategorie_id`)
    23. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=5 ;
    24. -- --------------------------------------------------------
    25. --
    26. -- Tabellenstruktur für Tabelle `forum_posts`
    27. --
    28. CREATE TABLE `forum_posts` (
    29. `f_post_id` int(11) NOT NULL auto_increment,
    30. `f_post_user_id` int(40) NOT NULL default '0',
    31. `f_post_thread_id` int(10) NOT NULL default '0',
    32. `f_post_text` text NOT NULL,
    33. `f_post_ip` text NOT NULL,
    34. `f_post_time` text NOT NULL,
    35. PRIMARY KEY (`f_post_id`)
    36. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=45 ;
    37. -- --------------------------------------------------------
    38. --
    39. -- Tabellenstruktur für Tabelle `forum_threads`
    40. --
    41. CREATE TABLE `forum_threads` (
    42. `f_thread_id` int(10) unsigned NOT NULL auto_increment,
    43. `f_thread_name` text NOT NULL,
    44. `f_thread_board_id` int(10) NOT NULL default '0',
    45. `f_thread_user_id` int(40) NOT NULL default '0',
    46. PRIMARY KEY (`f_thread_id`)
    47. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;
    48. -- --------------------------------------------------------
    49. --
    50. -- Tabellenstruktur für Tabelle `member`
    51. --
    52. CREATE TABLE `member` (
    53. `member_id` int(40) unsigned NOT NULL auto_increment,
    54. `member_name` varchar(70) NOT NULL,
    55. `member_password` varchar(32) NOT NULL,
    56. `member_email` text NOT NULL,
    57. `member_site_color` varchar(7) NOT NULL,
    58. `member_icq` int(9) unsigned NOT NULL default '0',
    59. `member_ac` varchar(50) NOT NULL,
    60. `member_aktiviert` int(1) NOT NULL,
    61. PRIMARY KEY (`member_id`)
    62. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;
    Alles anzeigen


    Query:

    Quellcode

    1. SELECT
    2. *,
    3. (SELECT ft.f_thread_id FROM forum_threads ft,forum_posts fp
    4. WHERE fp.f_post_thread_id = ft.f_thread_id AND ft.f_thread_board_id = fb.f_board_id
    5. ORDER BY fp.f_post_time DESC
    6. LIMIT 1) as last_thread_id,
    7. (SELECT ft.f_thread_name FROM forum_threads ft,forum_posts fp
    8. WHERE fp.f_post_thread_id = ft.f_thread_id AND ft.f_thread_board_id = fb.f_board_id
    9. ORDER BY fp.f_post_time DESC
    10. LIMIT 1) as last_thread_name,
    11. (SELECT fp.f_post_time FROM forum_threads ft,forum_posts fp
    12. WHERE fp.f_post_thread_id = ft.f_thread_id AND ft.f_thread_board_id = fb.f_board_id
    13. ORDER BY fp.f_post_time DESC
    14. LIMIT 1) as last_thread_time,
    15. (SELECT m.member_id FROM forum_threads ft,forum_posts fp, member m
    16. WHERE fp.f_post_thread_id = ft.f_thread_id AND ft.f_thread_board_id = fb.f_board_id AND m.member_id = fp.f_post_user_id
    17. ORDER BY fp.f_post_time DESC
    18. LIMIT 1) as last_thread_member_id,
    19. (SELECT m.member_name FROM forum_threads ft,forum_posts fp, member m
    20. WHERE fp.f_post_thread_id = ft.f_thread_id AND ft.f_thread_board_id = fb.f_board_id AND m.member_id = fp.f_post_user_id
    21. ORDER BY fp.f_post_time DESC
    22. LIMIT 1) as last_thread_member_name
    23. FROM forum_kategorien fk,forum_boards fb
    24. WHERE fb.f_board_kategorie_id = fk.f_kategorie_id
    25. GROUP BY fb.f_board_id
    26. ORDER BY f_kategorie_sortierung ASC
    Alles anzeigen


    Wie man sieht sind die Subquerys immer gleich nur das man da immer nur andere werte bekommt

    Ich hoffe es sind einpaar MySQL-Cracks dabei ;)

    Mit freundlichen Grüßen,
    Eugen Bolz
  • Meine Lösung ist ungetestet aber von der Idee her sollte es funktionieren:

    Quellcode

    1. SELECT fk.*
    2. , fb.*
    3. , ft.f_thread_id last_thread_id
    4. , ft.f_thread_name last_thread_name
    5. , fp.f_post_time last_thread_post_time
    6. , m.member_id last_thread_member_id
    7. , m.member_name last_thread_member_name
    8. FROM forum_boards fb
    9. LEFT JOIN forum_kategorien fk
    10. ON fb.f_board_kategorie_id = fk.f_kategorie_id
    11. LEFT JOIN forum_threads ft
    12. ON fb.f_board_id = ft.f_thread_board_id
    13. LEFT JOIN forum_posts fp
    14. ON ft.f_thread_id = fp.f_post_thread_id
    15. LEFT JOIN member m
    16. ON fp.f_post_user_id = m.member_id
    17. GROUP BY fb.f_board_id
    18. ORDER BY fk.f_kategorie_sortierung ASC
    19. , fp.f_post_time DESC
    20. ;
    Alles anzeigen


    Anmerkung: aus last_thread_time habe ich last_thread_post_time gemacht ...
  • wow damit geht es , sehr guT , vielen Dank ;)


    jetzt wollte ich einen anderen qry zum auslesen von allen threads des boards, sowie dessen letzen post, müsste der selbe qry sein , naja versucht habe ich es so

    Quellcode

    1. SELECT
    2. fb.f_board_id,
    3. fb.f_board_name
    4. , ft.f_thread_id last_thread_id
    5. , ft.f_thread_name last_thread_name
    6. , fp.f_post_time last_thread_post_time
    7. , fp.f_post_text last_post_text
    8. , m.member_id last_post_member_id
    9. , m.member_name last_post_member_name
    10. , m_thread.member_id thread_member_id
    11. , m_thread.member_name thread_member_name
    12. FROM forum_boards fb
    13. LEFT JOIN forum_threads ft
    14. ON fb.f_board_id = ft.f_thread_board_id
    15. LEFT JOIN forum_posts fp
    16. ON ft.f_thread_id = fp.f_post_thread_id
    17. LEFT JOIN member m
    18. ON fp.f_post_user_id = m.member_id
    19. LEFT JOIN member m_thread
    20. ON ft.f_thread_user_id = m_thread.member_id
    21. WHERE fb.f_board_id = 4
    22. GROUP BY last_thread_name
    23. ORDER BY fp.f_post_time DESC
    Alles anzeigen


    Funktioniert auch soweit , nur das er den ersten post des threads ausgibt und nicht den letzen

    ich glaube es liegt wegen dem GROUP BY weil dieses das ORDER BY nicht erst ausführen lässt

    kann man es irgendwie lösen das erst die posts sortiert werden bevor diese durch group by aussortiert werden?
  • ich versuche es heute mal mit CONCAT bei nem select eines subquerys dann müsste ich eigentlich alle werte bekommen können und dann den rest in php weiter aufteilen, naja wenn geklappt hat oder auch nich^^ werde ich mich melden , aber vorerst gn8^^

    EDIT:
    ok es geht mit Concat, habe concat_ws benutzt weil man dort auch noch den Seperator angeben kann

    Quellcode

    1. SELECT
    2. fb.f_board_id,
    3. fb.f_board_name
    4. , ft.f_thread_id last_thread_id
    5. , ft.f_thread_name last_thread_name
    6. , (
    7. SELECT
    8. CONCAT_WS('||',fp.f_post_id,fp.f_post_time,m.member_id,m.member_name)
    9. FROM forum_posts fp
    10. LEFT JOIN member m
    11. on fp.f_post_user_id = m.member_id
    12. WHERE
    13. fp.f_post_thread_id = ft.f_thread_id
    14. ORDER BY fp.f_post_time DESC
    15. LIMIT 1
    16. ) as last_post_info
    17. , m_thread.member_id thread_member_id
    18. , m_thread.member_name thread_member_name
    19. FROM forum_boards fb
    20. LEFT JOIN forum_threads ft
    21. ON fb.f_board_id = ft.f_thread_board_id
    22. LEFT JOIN member m_thread
    23. ON ft.f_thread_user_id = m_thread.member_id
    24. WHERE fb.f_board_id = 4
    25. GROUP BY last_thread_name
    Alles anzeigen