MySQL UPDATE with subqueries and join - mysql

Hi i am new to subqueries and so not sure if i am doing right
I am happy with this
SELECT t2.cons, t1.date, t1.account_no FROM
(
SELECT date, account_no FROM tbl_consignment_x3
) t1
INNER JOIN
(
SELECT cons, date, account_no FROM
tbl_volume_analysis
) t2
ON t2.account_no=t1.account_no AND t2.date=t1.date
It gives me the results i want to use
So i was hoping something like this below would do what i want but i can't get the syntax right plus i'm not sure if my technique is completely wrong
UPDATE tbl_margin_all t3
(
SELECT t2.cons, t1.date, t1.account_no FROM
(
SELECT date, account_no FROM tbl_consignment_x3
) t1
INNER JOIN
(
SELECT cons, date, account_no FROM
tbl_volume_analysis
) t2
ON t2.account_no=t1.account_no AND t2.date=t1.date
)
SET t3.cons=t2.cons
WHERE t1.date=t3.date AND t1.account_no=t3.account_no
thanks
ADDITION:
First i do a total count of consignments for a particular date taken from consignment table that is then written in volume table with the date and account.. then from consignments table i want to write to each consignment that count that i did.

You need to join with the first subquery -- put JOIN after t3.
Actually, you don't need any of the subqueries at all, you can just join directly with the tables.
UPDATE tbl_margin_all AS t3
JOIN tbl_consignment_x3 AS t1 ON t1.date = t3.date AND t1.account_no=t3.account_no
JOIN tbl_volume_analysis AS t2 ON t2.account_no=t1.account_no AND t2.date=t1.date
SET t3.cons = t2.cons
It's the same in the SELECT query, it should be:
SELECT t2.cons, t1.date, t1.account_no
FROM tbl_consignment_x3 AS t1
JOIN tbl_volume_analysis AS t2
ON t2.account_no=t1.account_no AND t2.date=t1.date

Notice the comma after t3 for syntax
UPDATE tbl_margin_all_4000 t3,
(
SELECT cons, t1.date, t1.account_no FROM
(
SELECT date, account_no, consignment_no FROM tbl_consignment_x3_4000
) t1
INNER JOIN
(
SELECT cons, date, account_no FROM
tbl_volume_analysis_4000
) t2
ON t2.account_no=t1.account_no AND t2.date=t1.date
) as src
SET t3.cons=src.cons
WHERE t3.date=src.date AND t3.account_no=src.account_no
this query took 4 mins. i had tried the double joins as suggested kindly but that took 45 mins.

Related

select join two table then order by latest upload time(uplaod_time column) in mysql select query

I got two table users(table 01)、record_dcm_upload(table02)
i try to query counts and latest upload file time by everylogin account(users.username)
like
SELECT record_dcm_upload.user_id, users.username, record_dcm_upload.upload_time, COUNT( * )
FROM record_dcm_upload
JOIN users ON ( users.id = record_dcm_upload.user_id )
GROUP BY record_dcm_upload.user_id
but my query sql got some problem (actually the result of upload_time not the latest)
how should i adjust my query code (hope user_id and upload_time all sort By DESC)
SELECT t2.id, t2.username, MAX(t1.upload_time), COUNT(*)
FROM record_dcm_upload t1
JOIN users t2 ON ( t2.id = t1.user_id )
GROUP BY t2.id, t2.username

Join with column outside subquery

SELECT t1.name as r_name, t1.values as r_values
FROM table as t1
JOIN (
SELECT SUM(amount) as amount
FROM database2.table
WHERE ids IN (t1.values)
) as t2
WHERE t1.id = 20;
I get an error, that t1.values inside the subquery is unknown column.
You need to rewrite your query and take inne where to join condition:
SELECT t1.name as r_name, t1.values as r_values
FROM table as t1
JOIN (
SELECT SUM(amount) as amount
FROM database2.table
) as t2 ON t2.ids = t1.values
WHERE t1.id = 20;
Also, you don't use amount column, so what is the point of join?
Another issue, you don't have any join condition defined.
I think you need to read about joins in SQL first :)
It seems you are trying to join database2.table to your t1 based on t1.values list.
I added group by IDs in t2 since your using aggregation function. Then, not sure what's the purpose of your sum(amount)
SELECT t1.name as r_name, t1.values as r_values
FROM table as t1
JOIN (
SELECT SUM(amount) as amount, ids
FROM database2.table
GROUP BY ids
) as t2 on t2.ids IN (t1.values)
WHERE t1.id = 20;

Get id of the record having Min() value

I have a complex mysql query where one of the Select fields is Min(value). Since all the 'values' are unique, is there also a way to get found min value's row id along?
In other words if we simplify the query to this question, it is like this:
SELECT t1.name, MIN(t2.value) AS minval
FROM table1 t1
LEFT JOIN table2 t2
ON t2.id_user = t1.id
GROUP BY id_user
How can i now know which t2.id was chosen for lowest t2.value for particular user? Thank you!
Use ROW_NUMBER() to find the first value of each id_user
You can replace * with the fields you need
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY t2.id_user ORDER BY t2.value) as rnk
FROM table1 t1
LEFT JOIN table2 t2
ON t2.id_user = t1.id
) as X
WHERE X.rnk = 1
Maybe this simple, dont know how complex your statement is:
SELECT name,value,id
FROM(
SELECT t1.name,t2.value,t2.id
FROM table1 t1
LEFT JOIN table2 t2
ON t2.id_user = t1.id
GROUP BY t2.id,id_user
ORDER BY t1.name,t2.id asc) as test
GROUP BY name;

Joining three tables such that extra matches are discarded?

How can I write a query to give the results of three tables such that there's only one result per "line"?
The tables are:
T1 (ID, name, IP)
T2 (ID, date_joined)
T3 (ID, address, date_modified)
The relations are:
T1-T2 1:1, T1-T3 1:M - there can be many address rows per ID in T3.
What I want is a listing of all users with the fields above, but IF they have an address, I only want to record ONE (bonus would be if it is the latest one based on T3.date_modified).
So I should end up with exactly the number of records in T1 (happens to be equal to T2 in this case) and no more.
I tried:
select t.ID, t.name, t.IP, tt.ID, tt.date_joined, ttt.ID, ttt.address
from T1 t JOIN T2 tt ON (t.ID = tt.ID) JOIN T3 ttt ON (t.ID = ttt.ID)
And every sensible combination of LEFT, RIGHT, INNER, etc joins I could think of! I keep getting multiple duplicate because of T3
This query should work:
select
t1.ID, t1.name, t1.IP, t2.date_joined, t3x.address
from t1
join t2 on t1.ID = t2.id
left join (
select t3.*
from t3
join (
select id, max(date_modified) max_date
from t3
group by id
) max_t3 on t3.id = max_t3.id and t3.date_modified = max_t3.max_date
) t3x on t1.ID = t3x.id
First you do the normal join between t1 and t2 and then you left join with a derived table (t3x) that is the set of t3 rows having the latest date.
So T2 is actually not relevant here. You just need a way to join from T1 to T3 in a way that gets you at most one T3 row per T1 row.
One way of doing this would be:
select
T1.*,
(select address from T3 where T3.ID=T1.ID order by date_modified desc limit 1)
from T1;
This won't likely be very efficient, being a correlated subquery, but you may not care depending on the size of your dataset.
It's also only good for getting one column from T3, so if you had Address, City, and State, you'd have to figure out something else.
You can use sub query with Top 1 so that u get only one result from T3
here is a sample sql
select * into #T1 from(
select 1 ID
union select 2
union select 3) A
select * into #T2 from(
select 1 ID
union select 2
union select 3) A
select * into #T3 from(
select 1 ID, 'ABC' Address, getDate() dateModified
union select 1, 'DEF', getDate()
union select 3, 'GHI', getDate()) A
select *, (select top 1 Address from #T3 T3 where T3.ID= T1.ID order by datemodified desc) from #T1 T1
inner join #T2 T2 on T1.ID = T2.ID
Bonus :- you can also add order by dateModified desc to get the latest address

MySQL query to return rows which are not listed in another table

I have two tables in MySQL DB PHPMyAdmin:
Table-1: T1
Table-2: T2
I need to write a mysql query which will return all IMEIs from T1 which are not listed in T2.
For example, in this case query should return 123456781235176.
Thanks.
try this select IMEI from T1 where IMEI not in (select IMEI from T2);
SELECT t1.* FRO table1 AS t1
LEFT JOIN table2 AS t2 ON t1.IMEI = t2.IMEI
WHERE t2.IMEI IS NULL
Try this Query
Select EMEI from t1 where EMEI not in (select EMEI from t2)
select IMEI from T1 where IMEI not in
(
select a.IMEI from T1 as a inner join T2 as b on a.IMEI = b.IMEI
) as exp
Hope this will help you
SELECT IMEI FROM T1 WHERE IMEI NOT IN(SELECT IMEI FROM T2);