FOR внутри FOR (вложенные SQL-запросы...)

Тема в разделе "Актуально, только не в тему", создана пользователем shurikkan, 23.10.2013.

  1. shurikkan
    Offline

    shurikkan Russian Joomla! Team Команда форума

    Регистрация:
    01.09.2011
    Сообщения:
    1 856
    Симпатии:
    162
    Пол:
    Мужской
    Привет всем.
    В общем попалась такая задача сегодня, сразу скажу - с Joomla не связанная :)
    Нужно сделать базу данных для хранения книжек и их авторов.
    Затем нужно вывести на страницу книги, но только те, у которых несколько авторов.
    Решил вот так:
    Код (PHP):
    1. CREATE DATABASE books_catalog;
    2.  
    3. USE books_catalog;
    4.  
    5. CREATE TABLE authors(id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, name VARCHAR(150) NOT NULL);
    6. CREATE TABLE books(id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, year INT(4));
    7. CREATE TABLE books_authors(id INT PRIMARY KEY AUTO_INCREMENT NOT NULL, book_id INT(8), author_id INT(8));
    8.  
    9. INSERT INTO authors(name) VALUES('Ivan');
    10. INSERT INTO authors(name) VALUES('Vasya');
    11. INSERT INTO authors(name) VALUES('Petya');
    12.  
    13. INSERT INTO books(title,year) VALUES('Book nomber one',2003);
    14. INSERT INTO books(title,year) VALUES('Second book',1960);
    15. INSERT INTO books(title,year) VALUES('Book three',1988);
    16.  
    17. INSERT INTO books_authors(book_id,author_id) VALUES(1,2);
    18. INSERT INTO books_authors(book_id,author_id) VALUES(2,1);
    19. INSERT INTO books_authors(book_id,author_id) VALUES(2,2);
    20. INSERT INTO books_authors(book_id,author_id) VALUES(2,3);
    21. INSERT INTO books_authors(book_id,author_id) VALUES(3,1);
    22. INSERT INTO books_authors(book_id,author_id) VALUES(3,3);

    Код (PHP):
    1. define('HOST','хост');
    2. define('LOGIN','логин');
    3. define('PASS','пароль');
    4. define('DBNAME','имя_таблицы');
    5.  
    6. $link = mysql_connect(HOST,LOGIN,PASS);
    7. //$link ? print('Соединение с сервером БД: ОК <br />') : print('Соединение с сервером БД: Ошибка! '.mysql_error().'<br /');
    8.  
    9. $select_db = mysql_select_db(DBNAME, $link);
    10. //$select_db ? print('Выбор БД: ОК <br />') : print("Выбор БД: Ошибка! mysql_error() <br />");
    11.  
    12. $query = "
    13.    SELECT DISTINCT(book_id)
    14.    FROM books_authors
    15.    HAVING book_id > 1";
    16. $result = mysql_query($query);
    17. //$result ? print('Ищем повторяющиеся ID книжек: ОК <br />') : print('Ищем повторяющиеся ID книжек: Ошибка! '.mysql_error().'<br /');
    18.  
    19. $rows = mysql_num_rows($result);
    20.  
    21. for($i=0; $i<$rows; $i++){
    22.    
    23.     $row = mysql_fetch_row($result);
    24.     $book_id = $row[0];
    25.    
    26.     $query2 = "
    27.        SELECT title,year
    28.        FROM books
    29.        WHERE id=$book_id";
    30.     $books = mysql_query($query2);
    31.     //$books ? print('Смотрим инфу по книжке: ОК <br />') : print('Смотрим инфу по книжке: Ошибка! '.mysql_error().'<br /');
    32.    
    33.     $rows_books = mysql_num_rows($books);
    34.     for($a=0;$a<$rows_books;$a++){
    35.         $book = mysql_fetch_assoc($books);
    36.         echo '<p>Название: '.$book["title"].'<br />Год написания: '.$book["year"].'</p>';
    37.     }
    38.    
    39. }

    Но вот, судя по слухам, выполнять один запрос с выводом результата через цикл внутри другого цикла - это плохой тон. А вот как по другому сделать - не знаю :(. Может подскажет кто своё видение реализации??
     
  2.  

Поделиться этой страницей

Загрузка...