简体   繁体   中英

MySQL inner join table gives repetaed value from unique table

Hello i have two tables with a PK---->FK Relationship in InnoDB Engine----> MySQL&PHP

The Relationship is one---->many between first table which is 'Properties' and second

table which is 'propertyimages' . every row in first table is unique but in second table

every row of first table has got many rows in second table How can i **SELECT unique row from

first table and all info about first table from second table here is my query:

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

it gives result:

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

In this result the PropertyName and PropertyStatus is Repeated but i want a

unique as its stored in the first tableThe propertyName and PropertyStatus

belongs to first table.The Propertyid and PropertyImagepath belings to second table.

unfortunately a join will create a record for each element found in table 2 with a matching parent element (id 8) in the first table.

you could use a GROUP BY id 8 on the first table field, but you may not get all the results you want since it will take the first image only.

could you restructure your process so that when it comes to the images (and thier display) you could just run a single query to get every image related to property 8

you could always use a nested query (presuming you're looking to display images on a page for a property, etc)

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

                }
            }
        }
    }
}

it would also help to know your DB structure .. i'd imagine you'd want something like this

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

I may be a bit oblivious to the FK method so if there is a lesson here for me as well, i'd love to hear what input you have.

you are one step away from the solution, you just need to select from second table and then for first so you will have all you result matched

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

You could achieve this with GROUP_CONCAT . But I also think, it is better to make two queries. Nothing wrong with that.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM