MySQL 5 Filter duplicates by one column only
Using mysql 5, because gcloud only supports that...
I'm trying to filter out tags with a duplicate text column from a query, and found one way to do so using ROW_NUMBER() and an OVER() clause to pick the first (by id) tag of tags with duplicate text, but am getting a syntax error because over doesn't exist in mysql 5.
SELECT
c.*,
CONCAT('[',
GROUP_CONCAT(CONCAT('"id":',
t.id,
', "company_id":',
t.company_id,
', "client_id":',
t.client_id,
', "user_id":',
t.user_id,
', "text":"',
t.text,
'", "color":"',
t.color,
'"')
ORDER BY t.id),
']') AS tags
FROM
company_users AS cu
LEFT JOIN
companies AS c ON cu.company_id = c.id
LEFT JOIN
(SELECT t.*, ROW_NUMBER() OVER(PARTITION BY `text` ORDER BY `id` ASC) AS tagnum
FROM client_tags AS t
) t ON c.id = t.company_id AND tagnum = 1
WHERE
# temp
cu.user_id = 1
GROUP BY c.id;
Is there something else I could use? I don't even know if this method would work because I can't run it.
mysql sql
add a comment |
Using mysql 5, because gcloud only supports that...
I'm trying to filter out tags with a duplicate text column from a query, and found one way to do so using ROW_NUMBER() and an OVER() clause to pick the first (by id) tag of tags with duplicate text, but am getting a syntax error because over doesn't exist in mysql 5.
SELECT
c.*,
CONCAT('[',
GROUP_CONCAT(CONCAT('"id":',
t.id,
', "company_id":',
t.company_id,
', "client_id":',
t.client_id,
', "user_id":',
t.user_id,
', "text":"',
t.text,
'", "color":"',
t.color,
'"')
ORDER BY t.id),
']') AS tags
FROM
company_users AS cu
LEFT JOIN
companies AS c ON cu.company_id = c.id
LEFT JOIN
(SELECT t.*, ROW_NUMBER() OVER(PARTITION BY `text` ORDER BY `id` ASC) AS tagnum
FROM client_tags AS t
) t ON c.id = t.company_id AND tagnum = 1
WHERE
# temp
cu.user_id = 1
GROUP BY c.id;
Is there something else I could use? I don't even know if this method would work because I can't run it.
mysql sql
1
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54
add a comment |
Using mysql 5, because gcloud only supports that...
I'm trying to filter out tags with a duplicate text column from a query, and found one way to do so using ROW_NUMBER() and an OVER() clause to pick the first (by id) tag of tags with duplicate text, but am getting a syntax error because over doesn't exist in mysql 5.
SELECT
c.*,
CONCAT('[',
GROUP_CONCAT(CONCAT('"id":',
t.id,
', "company_id":',
t.company_id,
', "client_id":',
t.client_id,
', "user_id":',
t.user_id,
', "text":"',
t.text,
'", "color":"',
t.color,
'"')
ORDER BY t.id),
']') AS tags
FROM
company_users AS cu
LEFT JOIN
companies AS c ON cu.company_id = c.id
LEFT JOIN
(SELECT t.*, ROW_NUMBER() OVER(PARTITION BY `text` ORDER BY `id` ASC) AS tagnum
FROM client_tags AS t
) t ON c.id = t.company_id AND tagnum = 1
WHERE
# temp
cu.user_id = 1
GROUP BY c.id;
Is there something else I could use? I don't even know if this method would work because I can't run it.
mysql sql
Using mysql 5, because gcloud only supports that...
I'm trying to filter out tags with a duplicate text column from a query, and found one way to do so using ROW_NUMBER() and an OVER() clause to pick the first (by id) tag of tags with duplicate text, but am getting a syntax error because over doesn't exist in mysql 5.
SELECT
c.*,
CONCAT('[',
GROUP_CONCAT(CONCAT('"id":',
t.id,
', "company_id":',
t.company_id,
', "client_id":',
t.client_id,
', "user_id":',
t.user_id,
', "text":"',
t.text,
'", "color":"',
t.color,
'"')
ORDER BY t.id),
']') AS tags
FROM
company_users AS cu
LEFT JOIN
companies AS c ON cu.company_id = c.id
LEFT JOIN
(SELECT t.*, ROW_NUMBER() OVER(PARTITION BY `text` ORDER BY `id` ASC) AS tagnum
FROM client_tags AS t
) t ON c.id = t.company_id AND tagnum = 1
WHERE
# temp
cu.user_id = 1
GROUP BY c.id;
Is there something else I could use? I don't even know if this method would work because I can't run it.
mysql sql
mysql sql
asked Nov 14 '18 at 0:23
Caden McCauleyCaden McCauley
31
31
1
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54
add a comment |
1
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54
1
1
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54
add a comment |
1 Answer
1
active
oldest
votes
You can use a correlated subquery to get the match that has the smallest id
:
SELECT . . .
FROM company_users cu LEFT JOIN
companies c
ON cu.company_id = c.id LEFT JOIN
client_tags t
ON t.company_id = c.id AND
t.id = (SELECT MIN(t2.id)
FROM client_tags t2
WHERE t2.text = t.text
)
WHERE cu.user_id = 1
Note that the correlated subquery needs to go in the ON
clause, because this is a LEFT JOIN
.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291415%2fmysql-5-filter-duplicates-by-one-column-only%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can use a correlated subquery to get the match that has the smallest id
:
SELECT . . .
FROM company_users cu LEFT JOIN
companies c
ON cu.company_id = c.id LEFT JOIN
client_tags t
ON t.company_id = c.id AND
t.id = (SELECT MIN(t2.id)
FROM client_tags t2
WHERE t2.text = t.text
)
WHERE cu.user_id = 1
Note that the correlated subquery needs to go in the ON
clause, because this is a LEFT JOIN
.
add a comment |
You can use a correlated subquery to get the match that has the smallest id
:
SELECT . . .
FROM company_users cu LEFT JOIN
companies c
ON cu.company_id = c.id LEFT JOIN
client_tags t
ON t.company_id = c.id AND
t.id = (SELECT MIN(t2.id)
FROM client_tags t2
WHERE t2.text = t.text
)
WHERE cu.user_id = 1
Note that the correlated subquery needs to go in the ON
clause, because this is a LEFT JOIN
.
add a comment |
You can use a correlated subquery to get the match that has the smallest id
:
SELECT . . .
FROM company_users cu LEFT JOIN
companies c
ON cu.company_id = c.id LEFT JOIN
client_tags t
ON t.company_id = c.id AND
t.id = (SELECT MIN(t2.id)
FROM client_tags t2
WHERE t2.text = t.text
)
WHERE cu.user_id = 1
Note that the correlated subquery needs to go in the ON
clause, because this is a LEFT JOIN
.
You can use a correlated subquery to get the match that has the smallest id
:
SELECT . . .
FROM company_users cu LEFT JOIN
companies c
ON cu.company_id = c.id LEFT JOIN
client_tags t
ON t.company_id = c.id AND
t.id = (SELECT MIN(t2.id)
FROM client_tags t2
WHERE t2.text = t.text
)
WHERE cu.user_id = 1
Note that the correlated subquery needs to go in the ON
clause, because this is a LEFT JOIN
.
answered Nov 14 '18 at 4:13
Gordon LinoffGordon Linoff
766k35297401
766k35297401
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291415%2fmysql-5-filter-duplicates-by-one-column-only%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
There's a user variables based solution here, sorry don't have time to write up an answer. mysql5 covers such broad range of implementations, suggest always using 5.7 as the two number together correspond to the major version.
– danblack
Nov 14 '18 at 0:54