如何查询1对多数据库关系并正确显示行?

时间:2010-12-10 03:46:58

标签: php mysql

抱歉,如果我的问题没有意义,但我对我想要完成的事情感到困惑。

这是我的桌子。

tbl_products(如果图像小,右键单击它并查看图片以查看它。) alt text

tbl_product_images

alt text

基本上tbl_products有产品及其描述的记录。和tbl_product_images有此产品的图像。我希望以这样的格式显示产品标题,描述及其图像。

alt text

问题是我写的查询是:

select
tbl_products.dealname,
tbl_products.desc,
tbl_products.price,
tbl_products.discount,
tbl_product_images.thumb,
tbl_product_images.large
from tbl_products
inner join tbl_product_images

on tbl_products.pHash = tbl_product_images.pHash where tbl_products.startdate = '2010-12-09';

显示这样的查询。

alt text

所以当我需要写这样的东西时

while($row = mysql_fetch_assoc($query))
{
   print $row['dealname'];
   print "<img src='".$row['large']."'>";
  //and so on.
}

我将看到该产品显示4次,因为我有4张此产品的图像。执行我想要完成的任务的最佳方式是什么?顺便说一句,Phash是另一种身份证明方式。它是我将产品标识与另一个表格联系起来的方式。

3 个答案:

答案 0 :(得分:1)

最简单,最直接的方法是进行两个查询:一个用于产品,一个用于获取一行,另一个用于照片,这将为您提供多行。

尝试在一个查询中执行此操作意味着您必须删除您要求数据库重复的数据。那太傻了。

答案 1 :(得分:1)

如果要在一个查询中获取所有内容,可以使用MySQL中的GROUP_CONCAT()函数,但是您必须使用PHP拆分图像信息。

以下是使用|的示例(管道)作为拇指/大图像文件名之间的分隔符。

查询:

select
tbl_products.dealname,
tbl_products.desc,
tbl_products.price,
tbl_products.discount,
GROUP_CONCAT(tbl_product_images.thumb SEPARATOR '|') AS thumbs,
GROUP_CONCAT(tbl_product_images.large SEPARATOR '|') AS images
from tbl_products
inner join tbl_product_images

on tbl_products.pHash = tbl_product_images.pHash
where tbl_products.startdate = '2010-12-09'
group by tbl_products.pHash;

PHP:

while($row = mysql_fetch_assoc($query))
{
   print $row['dealname'];

   // $thumbs = explode('|', $row['thumbs']);
   $images = explode('|', $row['images']);
   foreach ($images as $image) {
      print "<img src='".$image."'>";
   }
}

答案 2 :(得分:0)

创建指向要查看产品详细信息的页面的链接,方法是链接到该页面,并沿着?phash = $ phash的行传递qstring参数。

在详情页面上:

使用类似这样的SQL查询:

SELECT 
    tbl_products.dealname,
    tbl_products.desc,
    tbl_products.price,
    tbl_products.discount,
    tbl_product_images.thumb,
    tbl_product_images.large
FROM 
    tbl_products
INNER JOIN
    tbl_product_images
ON 
    tbl_products.pHash = tbl_product_images.pHash 
WHERE
    tbl_products.pHash = $detailsProductPHash



$i = 0;

while($row = mysql_fetch_assoc($query))
{
   if($i==0)   print $row['dealname'];
   print "<img src='".$row['large']."'>";
   $i++;
  //and so on.
}

据我所知,您只想显示一次产品信息,并多次显示图像。以上将完成你想要的。