PHP / MySQL nasıl bir SOL JOIN yinelenen bilgi kaldırabilirim?

2 Cevap php

Ben bir MySQL veritabanı tabloları bir dizi basit bir liste oluşturmak için çalışıyorum. Ben kullanıyorum SQL olduğunu:

$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'";

Bunu görüntülemek için kullanıyorum PHP bu gibi görünüyor:

     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>";
  }
}

Hangi aşağıdaki HTML üretir:

<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>

Ne gerçekten ihtiyacım olduğunda:

<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>

(Ürünler hariç) Her tablo bir ürün ile ilişkili birçok öğeleri olabilir, bu örnek sadece instructions prod_instruction_sheets tabloda birden fazla dizi var ne olur gösterir.

Ben cevap daha iyi bir MySQL açıklamada, ya da benim döngü PHP bir değişiklik olup olmadığından emin değilim. Herhangi bir yardım minnetle almış olacaktır.

2 Cevap

İhtiyacınız SELECT sadece alanına çalışın ve açıklamada anahtar DISTINCT kullanın:

$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:

Ok i see what you are doing, one easy way to filter this column in PHP is to put the line you are writting into an associative array and check if you have already write back this data. Move also your UL outside of the while loop if you don't have two list.

Örnek:

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>";
}

İlk bakışta çalışması gerekir gibi products.prod_id GROUP BY kokuyor.