PHP / MySQL Как удалить дублирующую информацию из LEFT JOIN? - PullRequest
1 голос
/ 28 января 2010

Я пытаюсь создать простой список из серии таблиц в базе данных MySQL. Я использую SQL:

$resource_sql = "SELECT prod_spec_sheets.spec_uri, prod_spec_sheets.spec_title, 
prod_photos.photo_uri, prod_photos.photo_title, 
prod_diagrams.diag_uri, prod_diagrams.diag_title, 
prod_ies.ies_uri, prod_ies.ies_title, 
prod_instruction_sheets.instr_sheet_uri, prod_instruction_sheets.instr_sheet_title
FROM products 
LEFT JOIN prod_spec_sheets ON products.prod_id = prod_spec_sheets.prod_id 
LEFT JOIN prod_photos ON products.prod_id = prod_photos.prod_id 
LEFT JOIN prod_diagrams ON products.prod_id = prod_diagrams.prod_id 
LEFT JOIN prod_ies ON products.prod_id = prod_ies.prod_id
LEFT JOIN prod_instruction_sheets ON products.prod_id = prod_instruction_sheets.prod_id 
WHERE products.prod_code = '$product_code'";

PHP, который я использую для отображения, выглядит следующим образом:

     if ($resource_num_rows > 1){
  echo '<h2>Downloads</h2>';
  while($row = mysql_fetch_array($resource_result, MYSQL_ASSOC)){
echo "<ul>";
$count = 0;
foreach ($row as $key => $value) {
  if ($count % 2) {
    echo '">' . $value . '</a></li>' . PHP_EOL;
  } else {
    echo '<li><a href="' . RESOURCES_URI . $value;
  }
  $count++;
}
echo "</ul>";
  }
}

, который генерирует следующий HTML:

<ul>
<li><a href="http://URL/ss_pil.pdf">Specs</a></li>
<li><a href="http://URL/pic_pil.jpg">Photo</a></li>
<li><a href="http://URL/pd_pil.TIF">Diagram</a></li>
<li><a href="http://URL/is_pil.pdf">Instructions</a></li>
</ul><ul><li><a href="http://URL/ss_pil.pdf">Specs</a></li>
<li><a href="http://URL/pic_pil.jpg">Photo</a></li>
<li><a href="http://URL/pd_pil.TIF">Diagram</a></li>
<li><a href="http://URL/isu_pil.pdf">Instructions (ALT)</a></li>
</ul>

Когда мне действительно нужно:

<ul>
<li><a href="http://URL/ss_pil.pdf">Specs</a></li>
<li><a href="http://URL/pic_pil.jpg">Photo</a></li>
<li><a href="http://URL/pd_pil.TIF">Diagram</a></li>
<li><a href="http://URL/is_pil.pdf">Instructions</a></li>
<li><a href="http://URL/isu_pil.pdf">Instructions (ALT)</a></li>
</ul>

Каждая таблица (кроме продуктов) может иметь много элементов, связанных с продуктом, в этом примере показано, что происходит, если в таблице prod_instruction_sheets более одного набора инструкций

Я не уверен, что ответ заключается в лучшем утверждении MySQL или изменении PHP в моем цикле. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Попробуйте ВЫБРАТЬ только нужное вам поле и используйте ключевое слово DISTINCT в своем утверждении:

$resource_sql = "SELECT DISTINCT prod_spec_sheets.spec_uri, prod_spec_sheets.spec_title, 
prod_photos.photo_uri, prod_photos.photo_title, 
prod_diagrams.diag_uri, prod_diagrams.diag_title, 
prod_ies.ies_uri, prod_ies.ies_title, 
prod_instruction_sheets.instr_sheet_uri, prod_instruction_sheets.instr_sheet_title
FROM products 
LEFT JOIN prod_spec_sheets ON products.prod_id = prod_spec_sheets.prod_id 
LEFT JOIN prod_photos ON products.prod_id = prod_photos.prod_id 
LEFT JOIN prod_diagrams ON products.prod_id = prod_diagrams.prod_id 
LEFT JOIN prod_ies ON products.prod_id = prod_ies.prod_id
LEFT JOIN prod_instruction_sheets ON products.prod_id = prod_instruction_sheets.prod_id 
WHERE products.prod_code = '$product_code'";

Edit:

Хорошо, я вижу, что вы делаете, один простой способ отфильтровать этот столбец в PHP - поместить строку, которую вы записываете, в ассоциативный массив и проверить, записали ли вы уже эти данные. Переместите также UL за пределы цикла while, если у вас нет двух списков.

Пример:

if ($resource_num_rows > 1){
    echo '<h2>Downloads</h2>' . PHP_EOL . '<ul>' . PHP_EOL;
    $seen=array(); //use to filter te line written
    while($row = mysql_fetch_array($resource_result, MYSQL_ASSOC)) {
        $count = 0;
        foreach ($row as $key => $value) {
            if ($count % 2) {
                $line .= '">' . $value . '</a></li>';

                // check if the line has already been output
                if (!array_key_exists($line, $seen)) {
                    // no mark it as written
                    $seen[$line]=true;

                    // and output the line
                    echo $line . PHP_EOL;
                }
            } else {
                $line='<li><a href="' . RESOURCES_URI . $value;
            }
            $count++;
        }
    }
    echo "</ul>";
}
0 голосов
/ 29 января 2010

GROUP BY products.prod_id пахнет так, как будто должно работать на первый взгляд.

...