Totallama
Totallama

Reputation: 448

How can I select data from one table depending on the data from another table

I have 2 tables: contracts_main_list and contracts_detail. In contracts_main_list I have columns:

user_id
contract_id

and in contracts_detail:

contract_id
other columns with data

I need to select all the rows from the table contracts_main_list WHERE user_id = some number. From these rows I need to get the list of contract numbers (from column contract_id) and according to them select rows corresponding to each of the contract number from the list. So something like:

WHERE contracts_detail.contract_id = contracts_main_list.contract_id

The contract_ids are probably gonna be unique, but in case there is some kind of error and there will be more rows with the same contract_id in either of the tables, I need to select only one row (so probably using DISTINCT) and select the latest record (both tables have a column id as a primary key)

Also if there is no row in contracts_detail matching with the contract_id to the contract_id of the first table contracts_main_list it should skip the row. But I guess the condition:

WHERE contracts_detail.contract_id = contracts_main_list.contract_id

already covers it.

I hope I made it clear enough. What I am trying to do in real life is show list of contracts with all the relevant data belonging to the user.

To sum this up, I need to find all the contracts belonging to the user and select the rows with details about each contract and finally get the data from the contracts_detail table as a result.

Upvotes: 0

Views: 131

Answers (1)

Joël Salamin
Joël Salamin

Reputation: 3576

Here is the result you're looking for:

SELECT CD.*
FROM (SELECT C2.contract_id
            ,MAX(C2.id) AS last_main_list_id 
            ,MAX(CD2.id) AS last_contracts_detail_id
      FROM contracts_main_list C2
      INNER JOIN contracts_detail CD2 ON CD2.contract_id = C2.contract_id
      GROUP BY C2.contract_id) L
INNER JOIN contracts_main_list C ON C.id = L.last_main_list_id
                                   AND C.user_id = ?
INNER JOIN contracts_detail CD ON CD.id= L.last_contracts_detail_id

This query use a subquery for the FROM because of the following indication you provided:

The contract_ids are probably gonna be unique, but in case there is some kind of error and there will be more rows with the same contract_id in either of the tables, I need to select only one row

If you're sure that the contract_id are unique, here is the same query without this check on contract_id:

SELECT CD.*
FROM contracts_main_list C
INNER JOIN contracts_detail CD ON CD.contract_id = C.contract_id
WHERE C.user_id = ?

Hope this will help you.

Upvotes: 1

Related Questions