简体   繁体   中英

replace the id with the username from an other table in a CROSS JOIN in MySQL

This question is regarding this one: Joining multiple tables to get NOT EQUAL values in MySQL

I want to extend the following query:

SELECT 
    d.dataid,
    d.colors,
    u.userid,
    u.username
FROM
    users u
        CROSS JOIN
    datas d
WHERE
    (u.userid , d.dataid) NOT IN (SELECT 
            c.userid, c.dataid
        FROM
            collections c)
        AND u.userid = 1

For this data sample:

table datas                 table users          table collections
dataid | colors  | addedby  userid | username    collectionid | userid | dataid
--------------------------  -------------------  ------------------------------
   1   | blue    |    1       1    | Brian            1       |    1   |   1
   2   | red     |    1       2    | Jason            2       |    2   |   3
   3   | green   |    2       3    | Marie            3       |    1   |   3
   4   | yellow  |    3                               4       |    3   |   2

These results are expected:

for Brian           
dataid | colors | userid | username
-----------------------------------
   2   | red    |   1    | Brian
   4   | yellow |   1    | Marie

for Jason
dataid | colors | userid | username
-----------------------------------
   1   | blue   |   2    | Brian
   2   | red    |   2    | Brian
   4   | yellow |   2    | Marie

The row "addedby", which inherits the userid from users, has been added. At the moment my query replaces the userid from users instead of the addedby from datas with the username. I really need the userid from datas replaced, not the userid from users. :-)

Does anyone have a clue how to solve this?

Thanks in advance!

cheers

Just join users table once again with datas table. And in the output use username from this join.

SELECT 
    d.dataid,
    d.colors,
    uo.userid,
    uo.username
FROM
    users u
        CROSS JOIN
    datas d
INNER JOIN
    users uo
ON d.added_by = uo.id

WHERE
    (u.userid , d.dataid) NOT IN (SELECT 
            c.userid, c.dataid
        FROM
            collections c)
        AND u.userid = 1

And I believe, that you might even write your query in this way

SELECT u.userid, u.username, d.dataid, d.colors

FROM username u
INNER JOIN datas d
   ON u.userid = d.addedby

WHERE d.dataid NOT IN (
   SELECT dataid 
   FROM collections
   WHERE userid = 1
)

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