MySQL内连接表从唯一表中提供重复值

时间:2013-04-21 08:12:33

标签: php mysql

你好我有两个表,在InnoDB引擎中有一个PK ----> FK关系----> MySQL& PHP

第一个表格'属性'与第二个

之间的关系是一个---->很多

'propertyimages'。第一个表中的每一行都是唯一的,但在第二个表中

第一个表的每一行在第二个表中都有很多行我怎样才能从

中选择唯一的行

第一个表和第二个表中第一个表的所有信息都是我的查询:

SELECT DISTINCT properties.PropertyName, 
                properties.PropertyStatus, 
                propertyimages.PropertyImageID, 
                propertyimages.ImagePath 
FROM properties 
   INNER JOIN propertyimages 
      ON properties.PropertyImageID=propertyimages.PropertyImageID 
     AND propertyimages.PropertyImageID=8;

它给出了结果:

PropertyName    PropertyStatus     Propertyid       property Image Path
Appartment      For Lease          8                upload/hydrangeas.jpg
Appartment      For Lease          8                upload/jelsh.jpg
Appartment      For Lease          8                upload/penguins.jpg
Appartment      For Lease          8                upload/tulips.jpg

在此结果中, PropertyName PropertyStatus 重复,但我想要

独特,因为它存储在第一个表格中 propertyName PropertyStatus

属于第一个表。 Propertyid PropertyImagepath 绑定到第二个表。

3 个答案:

答案 0 :(得分:0)

遗憾的是,连接将为表2中的每个元素创建一条记录,并在第一个表中使用匹配的父元素(id 8)。

你可以在第一个表字段上使用GROUP BY id 8,但是你可能无法得到你想要的所有结果,因为它只会拍摄第一张图片。

你可以重构你的过程,这样当涉及到图像(和它们的显示)时,你可以运行一个查询来获得与属性8相关的每个图像

您总是可以使用嵌套查询(假设您希望在页面上显示属性等图像)

$query1 = mysql_query("SELECT Propertyid, PropertyName, PropertyStatus FROM properties WHERE (search criteria)");
if (mysql_num_rows($query1) > 0) {
    while ($q1Row = mysql_fetch_array($query1)) {

        // Insert property specific data here before you display the images
        echo $q1Row['PropertyName']."<br>\n";
        echo $q1Row['PropertyStatus']."<br>\n";

        $query2 = "SELECT PropertyImageID, ImagePath FROM propertyimages WHERE PropertyImageID='".$q1Row['Propertyid']."'"
            if (mysql_num_rows($query2) > 0) {
                while ($q2Row = mysql_fetch_array($query2)) {

                    // add code here to do whatever you want with the images
                    echo '<image src="'.$q2Row['ImagePath'].'"><br>\n';

                }
            }
        }
    }
}

它也有助于了解你的数据库结构..我想你会想要这样的东西

table 1 (properties)
  PropertyID (Primary Key)
  PropertyName
  PropertyStatus

table 2 (propertyImages)
  ImageID (Primary Key)
  PropertyID (many to one reference to PropertyID in table 1)
  ImagePath

我可能对FK方法有点遗忘,所以如果我这里也有一个教训,我很想知道你有什么输入。

答案 1 :(得分:0)

你距离解决方案只有一步之遥,你只需要从第二个表中选择然后首先选择,这样你就可以得到所有你匹配的结果

SELECT DISTINCT properties.PropertyName, 
            properties.PropertyStatus, 
            propertyimages.PropertyImageID, 
            propertyimages.ImagePath 
FROM propertyimages 
   INNER JOIN properties  
     ON propertyimages.PropertyImageID = properties.PropertyImageID
     AND propertyimages.PropertyImageID=8;

答案 2 :(得分:0)

您可以使用GROUP_CONCAT实现此目的。但我也认为,最好进行两次查询。没错。

SELECT DISTINCT properties.PropertyName, 
                properties.PropertyStatus, 
                propertyimages.PropertyImageID, 
                GROUP_CONCAT(propertyimages.ImagePath) 
FROM properties 
   INNER JOIN propertyimages 
      ON properties.PropertyImageID=propertyimages.PropertyImageID 
      AND propertyimages.PropertyImageID=8;
GROUP BY propertyimages.PropertyImageID