За последние 24 часа нас посетили 52575 программистов и 1721 робот. Сейчас ищет 801 программист ...

Одновременный вывод значений из нескольких таблиц

Тема в разделе "PHP для новичков", создана пользователем paqwerty, 5 май 2011.

  1. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    Всем привет!

    У меня стоит задача - вывести значения нескольких таблиц одновременно.

    У меня есть например 3 таблицы:

    Код (Text):
    1. Табл.1:
    2. category   name       price
    3. 1              товар1     123
    4. 1              товар2     555
    5. 1              товар3     21
    6. 2              товар4     98
    7. 2              товар5     444
    8. 3              товар6     5
    9. 3              товар7     98
    10. 3              товар8     40
    11.  
    12. Табл.2:
    13. category   name       price
    14. 1              товар1     11
    15. 1              товар2     22
    16. 2              товар3     31
    17. 2              товар4     456
    18. 3              товар5     32
    19. 4              товар6     56
    20. 4              товар7     87
    21. 4              товар8     987
    22.  
    23. Табл.3:
    24. category   name       price
    25. 1              товар1     7654
    26. 2              товар2     56
    27. 2              товар3     656
    28. 3              товар4     55
    29. 4              товар5     25
    30. 5              товар6     3465
    31. 5              товар7     234
    32. 5              товар8     40
    Мне надо сделать сравнительный вывод цен этих трех таблиц например по категории 1, т.е. ожидается такая структура вывода:

    Код (Text):
    1. Название     товар1   товар2   товар3   ...   ...    
    2. Табл.1         123        555        21
    3. Табл.2         11          22         --
    4. Табл.3         7654       --          --
    Для этого как я понимаю, мне надо сначала вытащить названия всех таблиц из текущей бд:

    PHP:
    1.  
    2. <?php
    3. $result = mysql_list_tables("db_name");
    4. while ($table_data = mysql_fetch_row($result)) {
    5. //   echo $table_data[0]."<br>";
    6. $shop[] = $table_data[0];
    7. }
    8. ?>
    9.  
    а потом просто подставить поочереди в цикл с выводом собственно цен:

    PHP:
    1.  
    2. <?php
    3. foreach ($shop as $k => $v) {
    4. //   echo $k." - ".$v."<br>";
    5. $sql = mysql_query("SELECT name, price FROM '".$v."' WHERE category = 1", $link_id);
    6.    while ($sql_data = mysql_fetch_array($sql)) {
    7.       echo $sql_data."<br>";
    8.    }
    9. }
    10. ?>
    11.  
    Но такой вариант не работает, а точнее проблема (из текста сообщения ошибки) кроется в подстановке имени таблицы в цикле, из которой надо вывести данные.

    Помогите пожалуйста решить эту проблему...
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    названия колонок и таблиц в mysql заключаются в ` , а не в '

    ` находится на букве ё
     
  3. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    iliavlad - спасибо, помогло.

    Теперь все работает, но при этом всем мне почему-то выводит ошибку перед результатом -
    ссылаясь на вот эту строчку -

    PHP:
    1.  
    2. <?php
    3. ...
    4. $sql = mysql_query("SELECT name, price FROM '".$v."' WHERE category = 1", $link_id);
    5. ...
    6. ?>
    7.  
    НО ПРИ ЭТОМ КОД ВЫПОЛНЯЕТ СВОЮ РАБОТУ...
     
  4. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    тут только гадать. убирайте строчки по одной, смотрите, после убирания которой ошибка пропадёт. а то может она вообще не в этом файле.
     
  5. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    разобрался, у меня помимо этих таблиц есть еще одна с категориями (другая структура и данные), вот он мне и ругался на эту таблицу. Я ее исключил и все стало гуд.

    Теперь я могу вытащить все данные из всех таблиц за 2 цикла.

    Но вот как эти данные собрать и вывести в одной сводной таблице ума не приложу, может предложите что путное...

    В первом посте я немного не правильно расписал итоговую таблицу, там посложнее структура:

    Код (Text):
    1. Название     |   товар1(табл.1)    |   товар2(табл.1)   |  товар3(табл.1)  
    2.            |   товар1(табл.2)    |   товар2(табл.2)   |  товар3(табл.2)
    3. ---------------------------------------------------------------------------------------
    4. фирма1      |   цена_тов1(табл.1)  |  цена_тов2(табл.1)   |   цена_тов3(табл.1)
    5.            |   цена_тов1(табл.2)  |  цена_тов2(табл.2)   |   цена_тов3(табл.2)
    6. ---------------------------------------------------------------------------------------
    7. фирма2      |   цена_тов1(табл.1)  |  цена_тов2(табл.1)   |   цена_тов3(табл.1)
    8.            |   цена_тов1(табл.2)  |  цена_тов2(табл.2)   |   цена_тов3(табл.2)
    Имена товаров в каждой таблице свои, имена таблиц - это названия фирм. Суть этой таблицы - сравнение оригинальных товаров с их аналогами.

    Вооще такое можно сделать или все надо ручками набивать эту таблицу?
     
  6. karakh

    karakh Активный пользователь

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    выведи var_dump($sql) и посмотри что тебе возвращается. Скорее всего, в базе есть таблицы кроме этих трех и в одной из этих добавочных таблиц нет поля name или price. Поэтому один из запросов возвращает вместо результата ошибку, а ты пытаешься ее фетчить и естественно получаешь варнинг.
     
  7. paqwerty

    paqwerty Активный пользователь

    С нами с:
    2 мар 2007
    Сообщения:
    121
    Симпатии:
    0
    karakh
    именно так все и было, не было этих полей...
     
  8. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    так ручками и можно попробовать пару раз. когда будет ясен алгоритм работы, можно будет и автоматизировать.