Выборка данных из двух таблиц

kRivoRURK

Новичок
Есть база из которой нужно вытащить и оформить информацию по продуктам Две главные таблицы по продуктам -

ns_preces
Хранящая ID продукта и его название. (К примеру название ноутбука и его ID)

ns_preces_inf
Там храниться ID продуктов из предыдущей таблицы, информация о продукте. Каждая отдельная запись хранить свой параметр продукта.

Вывод реализовал, если код говно пишите что посмотреть и что прочесть, спам ненужен (см. листинг) . Добавил коментарии - поправте если ход мыслей неправельный.

PHP:
<?php

  echo htmlspecialchars('<?xml version="1.0" encoding="UTF-8"?>');
  echo "<br>";
  echo htmlspecialchars('<PRODUCTS>');
  echo "<br><br>";

mysql_connect("localhost","root","");
mysql_query('SET NAMES utf8');
mysql_select_db("database");

$db_parts = mysql_query("SELECT * FROM ns_preces");
// Присваиваем значения таблицы ns_preces в переменную db_parts - типа массив.
while($parts = mysql_fetch_row($db_parts)){
// Перебираем значения массива db_parts до конца.
  $model = $parts[2]; // Присваиваем значения третьей колонки переменной model.
//  $poisk = strpos($model,"MacBook");
  $poisk = strpos($model,"MacBook");
  // Сравниваем значения третьей колонки с нужным нам значением.


   if($poisk===false){} else {
   // Если поиск возвращает значение TRUE то в переменной  $parts[0] храняться 
   //    нужные нам ID.

      // echo htmlspecialchars('<ID>');
      // echo $parts[0];
      // echo htmlspecialchars('</ID>')."<br>";
	  
      echo htmlspecialchars('<NAME>');
      echo $parts[2];
      echo htmlspecialchars('</NAME>')."<br>";
    
   $db_parts_inf = mysql_query("SELECT * FROM ns_preces_inf WHERE precesid=".$parts[0]);
   // Присваиваем значения таблицы ns_preces_inf в переменную db_parts_inf,
   // c ID который берем в $parts[0].
   // Присваиваем значение четвертой колонны массиву ProductInfo
   while($parts_inf = mysql_fetch_row($db_parts_inf))
        $ProductInfo[] = $parts_inf[3];
       { 

      echo htmlspecialchars('<CPU>');
      echo $ProductInfo[0];
      echo htmlspecialchars('</CPU>')."<br>";

      echo htmlspecialchars('<RAM>');
      echo $ProductInfo[1];
      echo htmlspecialchars('</RAM>')."<br>";

      echo htmlspecialchars('<HDD>');
      echo $ProductInfo[2];
      echo htmlspecialchars('</HDD>')."<br>";

      echo htmlspecialchars('<GPU>');
      echo $ProductInfo[3];
      echo htmlspecialchars('</GPU>')."<br>";

      echo htmlspecialchars('<DVD>');
      echo $ProductInfo[4];
      echo htmlspecialchars('</DVD>')."<br>";

      echo htmlspecialchars('<Monitor>');
      echo $ProductInfo[5];
      echo htmlspecialchars('</Monitor>')."<br>";

      echo htmlspecialchars('<IO>');
      echo $ProductInfo[6];
      echo htmlspecialchars('</IO>')."<br>";

      echo htmlspecialchars('<LAN>');
      echo $ProductInfo[7];
      echo htmlspecialchars('</LAN>')."<br>";

      echo htmlspecialchars('<OS>');
      echo $ProductInfo[8];
      echo htmlspecialchars('</OS>')."<br>";

      echo htmlspecialchars('<AKUMULATOR>');
      echo $ProductInfo[9];
      echo htmlspecialchars('</AKUMULATOR>')."<br>";

      echo htmlspecialchars('<SIZE>');
      echo $ProductInfo[10];
      echo htmlspecialchars('</SIZE>')."<br>";

      echo htmlspecialchars('<WEIGHT>');
      echo $ProductInfo[11];
      echo htmlspecialchars('</WEIGHT>')."<br>";

      echo htmlspecialchars('<WARRANTY>');
      echo $ProductInfo[12];
      echo htmlspecialchars('</WARRANTY>')."<br><br>";
       
       } 
   }
};

  echo htmlspecialchars('</PRODUCTS>');
?>
Из первой таблицы беру ID из второй по ID информацию о продукте.

Встретился с такой задачей: Информацию выводит только о первом продукте из второй таблицы. А не по каждому конкретному товару.

Где неправ?
 

iceman

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

а если хочешь клеить тбл то используй
PHP:
select x.*, t.* from nns_preces as t
inner join nns_preces_inf as x on x.id = t.id
 

kRivoRURK

Новичок
iceman ты имеешь ввиду связь в таблице? Я тоже за твою реализацию, зачем так сделано загадка, имею дело с готовой базой => таблицами.

Переписал запрос так:
PHP:
$db_parts = mysql_query("SELECT
        ns_preces.precesid,
        ns_preces.model,
        ns_preces_inf.precesinfname
    FROM ns_preces
    INNER JOIN ns_preces_inf ON ns_preces.precesid = ns_preces_inf.precesid");
precesinfname та самая колона, которая хранит в себе записи по продукту. Записей по каждому продукту ровно 13 (CPU, HDD, GPU, ... ).

Присваиваю значение получаемые от $db_parts переменной $parts (Напрямую извлекать из $db_parts как понимаю нельзя).

Продолжаем сравнение и вывод:

PHP:
while($parts = mysql_fetch_row($db_parts)){

  $model = $parts[1];
  $poisk = strpos($model,"MacBook");

   if($poisk===false){} else {

      echo htmlspecialchars('<ID>');
      echo $parts[0];
      echo htmlspecialchars('</ID>')."<br>";

      echo htmlspecialchars('<NAME>');
      echo $parts[1];
      echo htmlspecialchars('</NAME>')."<br>";
Что получаю теперь:

1. Выводиться ID продукта и его NAME - 13 раз. Получается каждая запись относящаяся к продукту.
Как оставить только ID и NAME? Вариант который дал в первом сообщении выдает по одному ID и NAME. Почему сейчас выводит так - для меня загадка.

<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<ID>6713</ID>
2. precesinfname хранит записи по продукту - как их теперь выводить? Если значения precesinfname присвоить массиву, как он будет связан с выборкой выше?
 

kRivoRURK

Новичок
добавь ещё
PHP:
      echo htmlspecialchars('<precesinfname>'.$parts[2].'</precesinfname>');
выведет только одно значение, процессор. Это нерешение проблемы.

вывод br в xml не нужен
Я оформил файл для вывода в окне браузера а не в файл.

----

Что делаю сейчас.

Что бы выводить отдельные элементы преобразую третью колонку в массив $product_inf[] = $parts[2]; что бы иметь возможность выбирать отдельные данные.

Теперь код выглядит так:

PHP:
<?php
/* 
 * Тест INNER JOIN запроса
  */
mysql_connect("localhost","root","");
mysql_query('SET NAMES utf8');
mysql_select_db("pclv_msql");

$db_parts = mysql_query("SELECT
        ns_preces.precesid,
        ns_preces.model,
        ns_preces_inf.precesinfname
    FROM ns_preces
    INNER JOIN ns_preces_inf ON ns_preces.precesid = ns_preces_inf.precesid");

while($parts = mysql_fetch_row($db_parts)){

  $model = $parts[1];
  $poisk = strpos($model,"MacBook");

   if($poisk===false){} else {
$product_inf[] = $parts[2];
      echo htmlspecialchars('<ID>');
      echo $parts[0];
      echo htmlspecialchars('</ID>')."<br>";

      echo htmlspecialchars('<NAME>');
      echo $parts[1];
      echo htmlspecialchars('</NAME>')."<br>";

      echo htmlspecialchars('<CPU>');
      echo $product_inf[0];
      echo htmlspecialchars('</CPU>')."<br>";

      echo htmlspecialchars('<RAM>');
      echo $product_inf[1];
      echo htmlspecialchars('</RAM>')."<br>";
      };
}
?>
Ожидаю что выведет отдельно на товар ID, NAME а атрибуты товара будет брать из второй таблицы CPU RAM и другие. На выходе же получаю новые ID, NAME которые повторяются ровно столько же раз сколько атрибутов во второй таблице и информацию только по первому товару из второй таблицы.

<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<CPU>2.26 GHz, Intel Core 2 Duo</CPU>
<ID>2048 MB , DDR3</ID>
<ID>6713</ID>
<NAME>MacBook Pro 13.3"2.26Ghz MB990ZH/A</NAME>
<CPU>2.26 GHz, Intel Core 2 Duo</CPU>
<ID>2048 MB , DDR3</ID>

.... 13 раз

<ID>6882</ID>
<NAME>MacBook Pro 17", Core i5 2.53Ghz MC024</NAME>
<CPU>2.26 GHz, Intel Core 2 Duo</CPU>
<ID>2048 MB , DDR3</ID>
<ID>6882</ID>
<NAME>MacBook Pro 17", Core i5 2.53Ghz MC024</NAME>
<CPU>2.26 GHz, Intel Core 2 Duo</CPU>
<ID>2048 MB , DDR3</ID>

.... 13 раз

и так далее.
 

prolis

Новичок
PHP:
$lastId=0;
while (){
if ($lastId!=$parts[0])
 {
 echo $parts[0];
  $lastId=$parts[0];
 }
 echo $part[2];
}
 

KorP

Новичок
Я может перегрелся, но что выведет твой запрос:
PHP:
$db_parts = mysql_query("SELECT
        ns_preces.precesid,
        ns_preces.model,
        ns_preces_inf.precesinfname
    FROM ns_preces
    INNER JOIN ns_preces_inf ON ns_preces.precesid = ns_preces_inf.precesid");
id|model|precesinfname
и так столько раз, сколько у тебя полей во второй таблице, по этому:
Выводиться ID продукта и его NAME - 13 раз.
precesinfname из таблицы ns_preces_inf это одно поле, зачем ты его в массив пихаешь и что ты там надеешься найти?
 

kRivoRURK

Новичок
Я может перегрелся, но что выведет твой запрос:
PHP:
$db_parts = mysql_query("SELECT
        ns_preces.precesid,
        ns_preces.model,
        ns_preces_inf.precesinfname
    FROM ns_preces
    INNER JOIN ns_preces_inf ON ns_preces.precesid = ns_preces_inf.precesid");
id|model|precesinfname
и так столько раз, сколько у тебя полей во второй таблице, по этому:

precesinfname из таблицы ns_preces_inf это одно поле, зачем ты его в массив пихаешь и что ты там надеешься найти?
1. Имя продукта, его модель, информацию о продукте

2. Информация о продукте - все его данные хранятся во второй таблице. Не надеюсь а нахожу информацию по продукту. Только вывод идет по первому продукту.
 

KorP

Новичок
По-моему ты всё же плохо представляешь что выводит твой запрос.
ns_preces_inf - это одно поле в таблице precesinfname! у тебя все данные что - в одно поле занесены? открой sql, выполни этот запрос и посмотри какие тебе данные вернутся
 

kRivoRURK

Новичок
По-моему ты всё же плохо представляешь что выводит твой запрос.
ns_preces_inf - это одно поле в таблице precesinfname! у тебя все данные что - в одно поле занесены? открой sql, выполни этот запрос и посмотри какие тебе данные вернутся
Спасибо большое, ты мне глаза открыл в каком то смысле. Совсем забыл что запросы можно в том же phpmyadmin выполнять.

Если кому нужно будет вот решение:

PHP:
<?php

  echo htmlspecialchars('<?xml version="1.0" encoding="UTF-8"?>');
  echo "<br>";
  echo htmlspecialchars('<PRODUCTS>');
  echo "<br><br>";

mysql_connect("localhost","root","");
mysql_query('SET NAMES utf8');
mysql_select_db("pclv_msql");

/* Первый запрос
 */
$db_parts = mysql_query("SELECT precesid, proizvod FROM ns_preces");

static $Product_id = array();

while($parts = mysql_fetch_row($db_parts)){

  $model = $parts[1];
  $poisk = strpos($model,"Benro");


   if($poisk===false){} else {

               array_push($Product_id, $parts[0]);

             };
}
$numElements = count($Product_id);


/* Второй запрос
 */
$i = 0;

while ($i<$numElements )  {
   $db_parts_inf = mysql_query("SELECT
        ns_preces.precesid,
        ns_preces.model,
        ns_preces.cena,
        ns_preces_inf.precesinfname,
        ns_preces_inf.groupinfid
    FROM ns_preces
    INNER JOIN ns_preces_inf ON ns_preces.precesid = ns_preces_inf.precesid
    where ns_preces.precesid  =".$Product_id[$i]);


  $arr = array();
 while ($parts_inf = mysql_fetch_assoc($db_parts_inf)){
     $arr[] = $parts_inf; // Ассоциативный массив
 }
 echo htmlspecialchars('<PRODUCT>')."<br>";
      echo htmlspecialchars('<NAME>');
      echo $arr[0]["model"];;
      echo htmlspecialchars('</NAME>')."<br>";
      
      echo htmlspecialchars('<MAX_HEIGHT>');
      echo $arr[0]["precesinfname"];
      echo htmlspecialchars('</MAX_HEIGHT>')."<br>";

      echo htmlspecialchars('<MIN_HEIGHT>');
      echo $arr[1]["precesinfname"];
      echo htmlspecialchars('</MIN_HEIGHT>')."<br>";

      echo htmlspecialchars('<CLOSE_HEIGHT>');
      echo $arr[2]["precesinfname"];
      echo htmlspecialchars('</CLOSE_HEIGHT>')."<br>";

      echo htmlspecialchars('<MAX_WEIGHT>');
      echo $arr[3]["precesinfname"];
      echo htmlspecialchars('</MAX_WEIGHT>')."<br>";

      echo htmlspecialchars('<WEIGHT>');
      echo $arr[4]["precesinfname"];
      echo htmlspecialchars('</WEIGHT>')."<br>";

      echo htmlspecialchars('<PRICE>');
      echo $arr[0]["cena"];;
      echo htmlspecialchars('</PRICE>')."<br>";

 echo htmlspecialchars('</PRODUCT>')."<br><br>";
      $i++;
}
echo htmlspecialchars('</PRODUCTS>');
?>
Все работает именно так как мне нужно. Требуемый результат получен.

Ругайте - критикуйте реализацию, но именно такой результат мне нужен был в конце.

Всем спасибо.
 

KorP

Новичок
1. static $Product_id а зачем это в процедурке?
2.
PHP:
$model = $parts[1];
  $poisk = strpos($model,"Benro");


   if($poisk===false){} else {

               array_push($Product_id, $parts[0]);

             };
а не проще
PHP:
if (strpos($parts[1],"Benro") !== false)
{
	array_push($Product_id, $parts[0]);
}
зачем столько кода писать?
3.
PHP:
$numElements = count($Product_id);


/* Второй запрос
 */
$i = 0;

while
а почему не for?
PHP:
for ($i=0; $i<count($Product_id); $i++)
{
	...
}
4. mysqli

имхо
 
Сверху