2010-01-28 92 views
1

我想从MySQL数据库中的一系列表中生成一个简单的列表。我使用的SQL是:PHP/MySQL如何从LEFT JOIN中删除重复的信息?

$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

尝试SELECT只需要和使用关键字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'"; 

编辑:

好吧,我看到你在做什么,一个简单的方法来过滤此PHP中的一列是将要写入的行写入关联数组,并检查是否已写回该数据。 如果您没有两个列表,则还可以在while循环之外移动您的UL

例子:

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

所有这些字段都需要给出正确的响应 - 而DISTINCT不会做任何事情,因为它不是DB中的双精度值,双精度值是(我相信)代码的正确行为,我需要做的是从* second *返回的行中删除模糊的项目。 – Adam 2010-01-28 19:40:37

+0

查看我编辑的PHP方式 – Patrick 2010-01-29 08:05:00

0

GROUP BY products.prod_id闻起来像它应该乍一看工作。