Autor | Zpráva | ||
---|---|---|---|
Jarda0001 Profil |
#1 · Zasláno: 17. 3. 2018, 16:51:53
Potřebuji poradit jak najdu duplicitní hodnoty v tabulce.
Mám tabulku id, sloupc1, slopec2 a potřebuji vyselectovat všechny duplicitní hodnoty které mají stejné sloupec1 i sloupec2, tedy v jednom záznamu jsou stejné. Příklad: 1 Jan Novák 2 Karel Novák 3 Jan Novák tedy potřebuji označit že v záznamu 3 je již duplicitní hodnota |
||
Radek9 Profil |
Mělo by stačit udělat join na stejnou tabulku a dát podmínku na nižší ID. Třeba nějak takhle:
SELECT DISTINCT t1.id FROM tabulka t1 JOIN tabulka t2 ON t2.sloupec1 = t1.sloupec1 AND t2.sloupec2 = t1.sloupec2 AND t2.id < t1.id |
||
Jarda0001 Profil |
#3 · Zasláno: 18. 3. 2018, 09:22:49
Radek9:
Díky a jak tam přidám ještě nějakou podmínku where sloupec3 = xx |
||
Radek9 Profil |
#4 · Zasláno: 18. 3. 2018, 09:34:30
Jarda0001:
Normálně to přidáš WHERE klauzuli. A pokud se má i podle tohoto sloupce hodnotit duplicita, tak ho přídáš i do JOINu: SELECT DISTINCT t1.id FROM tabulka t1 JOIN tabulka t2 ON t2.sloupec1 = t1.sloupec1 AND t2.sloupec2 = t1.sloupec2 AND t2.sloupec3 = t1.sloupec3 AND t2.id < t1.id WHERE t1.sloupec3 = něco |
||
Jarda0001 Profil |
Radek9:
Chyba v dotazu (1064): Syntax error near 'WHERE t1.reward_to = '315602' at line 7 :-( |
||
Taps Profil |
#6 · Zasláno: 18. 3. 2018, 11:10:09
Jarda0001:
ukaž záis |
||
Radek9 Profil |
#7 · Zasláno: 18. 3. 2018, 11:13:58
Jarda0001:
A ideálně i schéma té tabulky. |
||
Jarda0001 Profil |
Radek9:
Mohu to poslat nějak soukromě? nebo jinak tady je kopie: SET NAMES utf8; SET time_zone = '+00:00'; SET foreign_key_checks = 0; SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; DROP TABLE IF EXISTS `copy_rewards`; CREATE TABLE `copy_rewards` ( `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT, `rewards_payment_id` bigint(11) unsigned NOT NULL DEFAULT '0', `reward_to` bigint(11) unsigned NOT NULL COMMENT 'Uživatel komu patří odměna', `downloader_id` bigint(11) unsigned NOT NULL COMMENT 'Uživatel, kdo soubor stahoval', `file_id` bigint(11) unsigned NOT NULL COMMENT 'Odkaz na soubor', `filename` varchar(255) NOT NULL COMMENT 'Název souboru', `mime` varchar(64) NOT NULL COMMENT 'Typ souboru', `size` bigint(11) unsigned NOT NULL COMMENT 'Velikost souboru', `reward` decimal(15,4) unsigned NOT NULL, `date_created` datetime NOT NULL COMMENT 'Datum vytvoření záznamu', PRIMARY KEY (`id`), KEY `rewards_payment_id_reward_to` (`rewards_payment_id`,`reward_to`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `copy_rewards` (`id`, `rewards_payment_id`, `reward_to`, `downloader_id`, `file_id`, `filename`, `mime`, `size`, `reward`, `date_created`) VALUES (443038, 2324, 1020598, 437676, 57630, 'abbbbb', 'video/x-msvideo', 762504074, 0.0213, '2015-12-21 15:50:45'), (445560, 2324, 1020598, 1357260, 57630, 'abbbbb', 'video/x-msvideo', 762504074, 0.0213, '2015-12-21 20:44:27'), (445799, 2324, 1020598, 754151, 57630, 'abbbbb', 'video/x-msvideo', 762504074, 0.0213, '2015-12-21 21:15:23'), (449798, 2324, 1020598, 753357, 58597, 'gfggggff', 'video/x-msvideo', 2026907258, 0.0566, '2015-12-22 13:48:26'), (449973, 2324, 1020598, 1077209, 58597, 'gfggggff', 'video/x-msvideo', 2026907258, 0.0566, '2015-12-22 14:11:50'), (6418430, 2324, 1020598, 1077209, 58597, 'gfggggff', 'video/x-msvideo', 2026907258, 0.0566, '2015-12-22 14:11:50'), (6418431, 2324, 1020598, 754151, 57630, 'abbbbb', 'video/x-msvideo', 762504074, 0.0213, '2015-12-21 21:15:23'); sloupec1 =downloader_id sloupec2 = file_id where sloupec3 = reward_to potřebuji prostě v té tabulce vyselectovat všechny záznamy kde jsou shody downloader_id. file_id |
||
Jarda0001 Profil |
#9 · Zasláno: 18. 3. 2018, 16:25:52
Radek9:
Mimochodem rád bych si za tenhle funkční sql dotaz zaplatil :-) přece jen ho potřebuji k práci a ten kdo nám to původně dělal v současné době nemá na nás vůbec čas :-( |
||
Taps Profil |
#10 · Zasláno: 18. 3. 2018, 16:36:07
jak vypada tvuj sql dotaz?
|
||
Jarda0001 Profil |
SELECT DISTINCT t1.id
FROM rewards t1 JOIN rewards t2 ON t2.downloader_id= t1.downloader_id AND t2.file_id= t1.file_id AND t2.id < t1.id WHERE t1.reward_to = 315602 Taps: A ještě jeden problém, tenhle sql dotaz mi vypíše novou tabulku, ale já bych potřeboval vypsat jen položky které tomu odpovídají v současné tabulce, tak abych s těmi záznamy mohl potom dále pracovat |
||
Radek9 Profil |
#12 · Zasláno: 18. 3. 2018, 17:18:23
Jarda0001:
Mně tenhle uvedený dotaz funguje a v tomto případě vrací dvě duplicity (pro reward_to 1020598): sqlfiddle.com/#!9/a69bc1/3 |
||
Jarda0001 Profil |
#13 · Zasláno: 18. 3. 2018, 17:27:38
Radek9:
To ano ale s tím where mi to nefungovalo a jak jsem již napsal ono to vypíše novou tabulku, ale jeá potřebuji aby to vypsalo data přímo v té tabulce aby se s sním dalo pracovat například označit a smazat takové záznamy |
||
Radek9 Profil |
Jarda0001:
„ono to vypíše novou tabulku“ Ono to nevypíše novou tabulku, ale jen id těch záznamů. Pokud chceš vypsat všechny sloupce, tak takto: SELECT DISTINCT t1.* FROM rewards t1 JOIN rewards t2 ON t2.downloader_id = t1.downloader_id AND t2.file_id = t1.file_id AND t2.id < t1.id WHERE t1.reward_to = 1020598 Zároveň, jak jsem psal výše, pokud se má u těch duplicit ověřovat i shoda v tom sloupci reward_to (a ne jen v downloader_id a file_id ), tak tam musí být ještě tato podmínka:
SELECT DISTINCT t1.* FROM rewards t1 JOIN rewards t2 ON t2.downloader_id = t1.downloader_id AND t2.file_id = t1.file_id AND t2.reward_to = t1.reward_to AND t2.id < t1.id WHERE t1.reward_to = 1020598 |
||
Jarda0001 Profil |
#15 · Zasláno: 18. 3. 2018, 18:13:37
Radek9:
Jasně, sorry za blbé dotazy :-) ale když dám select normálně v tabulce tak mi to vypíše data a na začátku každého řádku mi to dá zaškrtávací pole, abych mohl označit řádky, které chci třeba smazat a to tady u toho není :-( |
||
Taps Profil |
#16 · Zasláno: 18. 3. 2018, 18:34:34
Jarda0001:
„abych mohl označit řádky, které chci třeba smazat a to tady u toho není :-(“ Toto musíš doprogramovat. |
||
Radek9 Profil |
#17 · Zasláno: 18. 3. 2018, 18:37:11
Jarda0001:
Myslíš v phpmyadmin? No, bojím se, že to asi u takovýchhle dotazů fungovat nebude. Pokud chceš nějaké záznamy ze zobrazených smazat, tak si vezmi jejich ID a spusť tento dotaz: DELETE FROM rewards WHERE id IN (1, 2, 3, ...); |
||
Kajman Profil |
#18 · Zasláno: 18. 3. 2018, 20:35:30
A chcete smazat všechny nalezené řádky nebo jen některé z nich?
Pokud všechny, tak v delete jde také join použít... Některé časteji řešené dotazy pro MySQL - FAQ » Odstranění duplicit |
||
Jarda0001 Profil |
#19 · Zasláno: 19. 3. 2018, 11:08:30
Kajman:
Ano chtěl bych smazat všechny řádky které odpovídají podmínce výběru |
||
Kcko Profil |
#20 · Zasláno: 19. 3. 2018, 11:36:55
Jarda0001:
Řešení máš v [#17] Radek9 |
||
Časová prodleva: 6 let
|
0