Question

I have 2 tables: "shares" and "pending_share_changes". The "shares" table has the following columns:

share_ID, asset_ID, member_ID, percent_owner, is_approved

pending_share_changes has the following columns:

share_change_ID, asset_ID, member_ID, percent_owner, is_approved, requested_by

I have a form (php) which lists the pending changes which the members have to approve or deny. Everything works fine unless the member has no existing shares, which means there is no record in the "shares" table for them. The query I am using to view the pending share changes is as follows:

SELECT p.share_change_ID, assets.asset_desc, assets.asset_value, shares.percent_owner AS 
          percent_owner_old, p.percent_owner 
          FROM pending_share_changes as p
          inner join assets on assets.asset_ID = p.asset_ID
          inner join shares on shares.asset_ID = p.asset_ID AND shares.member_ID = p.member_ID
          INNER JOIN orgs ON orgs.org_ID = assets.org_ID
          WHERE orgs.org_ID = '$org_ID' AND p.member_ID = '$member_ID' AND p.is_approved = '0'

I tried using IFNULL(shares.percent_owner, 0) AS percent_owner_old but that didn't work. The query returns no results. I would like to have the percent_owner_old column display a "0" if there is no record in the shares table.

Thanks.

Was it helpful?

Solution

Try changing your join to shares from an INNER JOIN to a LEFT JOIN.

SELECT ....
FROM pending_share_changes p
....
LEFT JOIN shares ON shares.asset_ID = p.asset_ID AND shares.member_ID = p.member_ID

This means "for every member_ID and asset_ID in p, join it to the matching row in shares. If the member_ID/asset_ID exists in p but not shares, make a row anyway and set the corresponding values to NULL".

The INNER JOIN means to only show joined rows where the relevant record exists in both tables.

Then you can combine with the IFNULL(shares.percent_owner,0) AS percent_owner_old.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top