Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос к двум связным таблицам
 
 автор: romu4-   (29.04.2009 в 18:16)   письмо автору
111.4 Кб
 
 

Нужно вывести информацию из БД. Таблицы имеют тип InnoDb и связаны так как показано на рисунке.
Нужно показать в табличном виде какому виду радиостанций подходят какие виды зарядных устройств и батарей.
Не могу сформировать правильный запрос на вывод (полей таблицы r_models и полей таблиц r_b и r_c), так чтобы поля таблицы r_model выводились все, а из таблиц r_b, r_c выводилось только поля b_model и с_model , которые являются частью составного ключа.
Подскажите пожалуйста как это сделать.
Привожу листинг вывода таблицы, без вывода полей c_model, b_model.


<body>

   <?php
   
echo ("Список моделей радиостанций:<br><br>");
   
   
// Соединение с базой даных
   
require_once ("config.php");
   
   
// Делается выборка из таблиц базы данных
   
   
$query ="SELECT r_models.* FROM r_models";
   
$result mysql_query ($query,$dbcon);
   
$myrow mysql_fetch_array ($result);
  
   
// Я пробовал по разному- много разных запросов и один запрос с подзапросами
   
   //$queryb ="SELECT * FROM r_b";
   //$resultb = mysql_query ($queryb,$dbcon);
   //$myrowb = mysql_fetch_array ($resultb);
   
   //$queryc ="SELECT * FROM r_c";
   //$resultc = mysql_query ($queryc,$dbcon);
   //$myrowc = mysql_fetch_array ($resultc);
   
   // Вывод результата выборки на экран
   
   
?>
   
     <table width="1200" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
     <tr>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Модель радиостанции </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стандарт радиостанции </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стационарность  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Периодичность ТО  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Срок службы  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые аккумуляторные батареи  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые зарядные устройства  </strong></td>
     </tr>

   <?php
    
   
do
   {
   echo 
"<tr><td>".$myrow['r_model']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['standard']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['stationarity']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['period_to']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['life']."</td>";
   if 
$myrow['r_model'] = $myrow['r_model'
   
//echo "<td>".$myrow['b_model']."</td>";  В этих столбцах нужно вывести совместимые батареи 
   //echo "<td>".$myrow['c_model']."</td></tr>";  В этих столбцах нужно вывести совместимые зарядники 
   
}
   while  (
$myrow mysql_fetch_array ($result));
   
    
?>
    </table>
</body>



  Ответить  
 
 автор: Trianon   (29.04.2009 в 18:24)   письмо автору
 
   для: romu4-   (29.04.2009 в 18:16)
 

Вывести модели одниго типа комплектующих ( к примеру - батареи ) у Вас получилось?

Уберите do while. Ему здесь не место.

  Ответить  
 
 автор: romu4-   (29.04.2009 в 18:28)   письмо автору
 
   для: Trianon   (29.04.2009 в 18:24)
 

У меня получилось сделать вывод всех полей таблицы r_models. Это делается в цикле Do - While.
А вот поля b_model и c_model я не могу понять как выводить.

  Ответить  
 
 автор: Trianon   (29.04.2009 в 18:41)   письмо автору
 
   для: romu4-   (29.04.2009 в 18:28)
 

Так... Чувствую, диалог будет "не в коня корм"...
Поэтому ответ напишу, поскольку запрос, позволяющий вытащить данные, и вправду нетривиальный.
SELECT m.*, bls, cls
FROM r_models m 
 LEFT JOIN 
  (SELECT r_model AS brm, GROUP_CONCAT(b_model SEPARATOR ',') AS bls  
    FROM r_b 
  ) AS sb ON r_model = brm
 LEFT JOIN
   (SELECT r_model AS crm, GROUP_CONCAT(c_model SEPARATOR ',') AS cls  
    FROM r_c 
  ) AS sc ON r_model = crm


Комментариев не будет.

Почему зарядное устройство определяется рацией, а не батареей, у меня вызывает отдельное недоумение.

  Ответить  
 
 автор: romu4-   (29.04.2009 в 18:59)   письмо автору
 
   для: Trianon   (29.04.2009 в 18:41)
 

По поводу радиостанций и зарядных устройств:
Дело в том, что нынче зарядное устройство физически подключается к радиостанции, хотя заряд осуществляется аккумуляторной батареи. Как у современных мобильных телефонов. Хотя есть и такие, которые заряжают непосредственно батарею. Но я решил все завязать на рацию, тк к ней сводятся все устройства.
Вы не первый , кто задает мне такой вопрос...
Если вы сейчас скажите что по-вашему правильно связать ЗУ и батарею, то теперь пожалуй я склонюсь к вашей точке зрения.
_______________________

P.S. Запрос какой то диковинный , попробую применить. :)

  Ответить  
 
 автор: Trianon   (29.04.2009 в 19:11)   письмо автору
 
   для: romu4-   (29.04.2009 в 18:59)
 

>Если вы сейчас скажите что по-вашему правильно связать ЗУ и батарею, то теперь пожалуй я склонюсь к вашей точке зрения.

Боже упаси. Просто мне показалось странным, что в свойствах зарядки указывается количество батарей.
Раз меняться может количество батарей, значит в зарядку втыкаются батареи а не рации.

Фактически, если некая штуковина подключается к рации и заряжает батарею в ней, то зарядным устройством следует считать саму рацию, а штуковину - лишь источником питания этого самого "зарядного устройства".

У [как инимум некоторых] мобильников зарядные устройства и автономные есть.

  Ответить  
 
 автор: romu4-   (29.04.2009 в 19:46)   письмо автору
 
   для: Trianon   (29.04.2009 в 19:11)
 

Кроме того теперь обработка запроса стала долгой , в каждой таблице менее 5 записей.
Что будет если их будет по 30 допустим.

Можно ли сделать выборку этих данных используя три разных запроса и затем проанализировать их результаты средствами PHP? После чего сделать вывод на экран в виде таблицы? Или это менее эффективно?

  Ответить  
 
 автор: Trianon   (29.04.2009 в 19:57)   письмо автору
 
   для: romu4-   (29.04.2009 в 19:46)
 

Как выглядит дамп структуры таблиц?
А лучше - полный дамп вообще, уж коль скоро там всего по пять позиций?
Мне почему-то кажется, что индексы в нем отсутствуют напрочь.
Можно и на уровне php всё это сделать.
Но пока у Вас применяектся do-while, мне сказать нечего.

  Ответить  
 
 автор: romu4-   (01.05.2009 в 16:08)   письмо автору
 
   для: Trianon   (29.04.2009 в 19:57)
 

Я могу Вам показать (отправить) полную структуру базы данных.
Если это поможет...
Индексацию применяю в принципе везде, где необходимо.
В данном случае элементы таблиц являются частью составного ключа, который и так индексируется, по-моему конечно.

  Ответить  
 
 автор: Trianon   (01.05.2009 в 16:32)   письмо автору
 
   для: romu4-   (01.05.2009 в 16:08)
 

>В данном случае элементы таблиц являются частью составного ключа, который и так индексируется, по-моему конечно.

если составной индекс создан, то индексируется обращение по полному ключу и по первому его элементу. По второму - с чего бы?

  Ответить  
 
 автор: romu4-   (02.05.2009 в 07:40)   письмо автору
 
   для: Trianon   (29.04.2009 в 19:57)
 

> Уберите do while. Ему здесь не место.
> Но пока у Вас применяется do-while, мне сказать нечего.

Здравствуйте, Trianon!
Все хотел спросить: "Чем плох цикл do-while?".
Лучше использовать WHILE {}? Или есть что-нибудь эффективней и лучше?

  Ответить  
 
 автор: Trianon   (02.05.2009 в 10:11)   письмо автору
 
   для: romu4-   (02.05.2009 в 07:40)
 

do-while ориентирован на ситуации, когда логикой совершенно однозначно задано выполнение оператора цикла как минимум один раз.
Чтение курсора результата sql-запроса к таким ситуациям не относится.

  Ответить  
 
 автор: romu4-   (29.04.2009 в 19:41)   письмо автору
99 Кб
 
   для: Trianon   (29.04.2009 в 18:41)
 

Выборка не производится, отображаются только поля из таблицы r_models.
Возможно я не правильно произвожу вывод, хотя с моими простяцкими запросами поля заполнялись, только не соответствовали истине.
Поглядите пожалуйста код - правильно ли я применил запрос и вывод его результата.
Результат на скринсшоте.


<body>

   <?php
   
echo ("Список моделей радиостанций:<br><br>");
   
   
// Соединение с базой даных
   
require_once ("config.php");
   
   
// Делается выборка из таблиц базы данных
   
   
$query ="SELECT m.*, bls, cls
            FROM r_models m 
             LEFT JOIN 
              (SELECT r_model AS brm, GROUP_CONCAT(b_model SEPARATOR ',') AS bls FROM r_b) AS sb ON r_model = brm
             LEFT JOIN
               (SELECT r_model AS crm, GROUP_CONCAT(c_model SEPARATOR ',') AS cls FROM r_c) AS sc ON r_model = crm "
;
   
$result mysql_query ($query,$dbcon);
   
$myrow mysql_fetch_array ($result);
  
   
// Я пробовал по разному- много разных запросов и один запрос с подзапросами
   
   //$queryb ="SELECT * FROM r_b";
   //$resultb = mysql_query ($queryb,$dbcon);
   //$myrowb = mysql_fetch_array ($resultb);
   
   //$queryc ="SELECT * FROM r_c";
   //$resultc = mysql_query ($queryc,$dbcon);
   //$myrowc = mysql_fetch_array ($resultc);
   
   // Вывод результата выборки на экран
   
   
?>
   
     <table width="1200" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
     <tr>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Модель радиостанции </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стандарт радиостанции </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стационарность  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Периодичность ТО  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Срок службы  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые аккумуляторные батареи  </strong></td>
     <td align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые зарядные устройства  </strong></td>
     </tr>

   <?php
    
   
do
   {
   echo 
"<tr><td>".$myrow['r_model']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['standard']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['stationarity']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['period_to']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['life']."</td>";
   echo 
"<td>".$myrow['b_model']."</td>";
   
//echo "<td>".$myrow['c_model']."</td></tr>"; ; В этих столбцах нужно вывести совместимые зарядники
   
}
   while  (
$myrow mysql_fetch_array ($result));
   
    
?>
    </table>
</body>

  Ответить  
 
 автор: romu4-   (07.05.2009 в 12:32)   письмо автору
5.5 Кб
 
   для: Trianon   (29.04.2009 в 18:41)
 

Добрый день, Trianon!
Я на некоторое время отвлекался от этого запроса и вот вернулся обратно.
Запрос не осуществляет правильной выборки из таблиц.
Не могли бы вы завершить начатое ;-) , а то мне без Вас никак не справиться!
Дамп прилагается!


<body>

   <?php
   
   
include ("menu_top.php");
   
   echo (
"<div align=\"center\">  <p> <br> </p> <span class=\"StyleForHeader\">Список моделей радиостанций</span> <p> <br> </p>");
   
   
// Соединение с базой даных
   
require_once ("config.php");
   
   
// Делается выборка из таблиц базы данных
   
   
$query ="SELECT m.*, bls, cls
            FROM r_models m 
             LEFT JOIN 
              (SELECT r_model AS brm, GROUP_CONCAT(b_model SEPARATOR ',') AS bls FROM r_b) AS sb ON r_model = brm
             LEFT JOIN
               (SELECT r_model AS crm, GROUP_CONCAT(c_model SEPARATOR ',') AS cls FROM r_c) AS sc ON r_model = crm "
;
   
//$query ="SELECT r_models.*, r_b.b_model
               //FROM r_models, r_b
            //WHERE r_models.r_model=r_b.r_model";
   
$result mysql_query ($query,$dbcon);
   
$myrow mysql_fetch_array ($result);
   if(!
$result) exit("Error in $sqlu : "mysql_error());
   
   
// Вывод результата выборки на экран
   
   
?>
   
    <br>
   <table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
     <tr>
     <td width="14%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Модель радиостанции </strong></td>
     <td width="10%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стандарт радиосвязи </strong></td>
     <td width="13%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Стационарность  </strong></td>
     <td width="11%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Периодичность ТО  </strong></td>
     <td width="9%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Срок службы (лет) </strong></td>
     <td width="17%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые аккумуляторные батареи  </strong></td>
     <td width="17%" align="center" valign="middle" bgcolor="#CCCCCC"><strong> Используемые зарядные устройства  </strong></td>
     <td width="9%" align="center" valign="middle" bgcolor="#CCCCCC"><strong>Действия</strong></td>
     </tr>

   <?php
    
   
do
   {
   echo 
"<tr><td align=\"center\" valign=\"middle\">".$myrow['r_model']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['standard']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['stationarity']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['period_to']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['life']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['bls']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">".$myrow['cls']."</td>";
   echo 
"<td align=\"center\" valign=\"middle\">
           <a href=\"/r_models_update_form.php?r_model="
.$myrow['r_model']."\">Редактировать </a><br>
           <a href=\"/r_models_delete_form.php?r_model="
.$myrow['r_model']."\">Удалить </a>
        </td></tr>"
;
   }
   while  (
$myrow mysql_fetch_array ($result));
   
    
?>
    </table>
    
</body>

  Ответить  
 
 автор: romu4-   (29.04.2009 в 18:30)   письмо автору
99 Кб
 
   для: Trianon   (29.04.2009 в 18:24)
 

Вот форма которую я вывожу.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования