Autor Zpráva
Jarda0001
Profil
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
Radek9:
Díky a jak tam přidám ještě nějakou podmínku where sloupec3 = xx
Radek9
Profil
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
Jarda0001:
ukaž záis
Radek9
Profil
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
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
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
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
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
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
Jarda0001:
abych mohl označit řádky, které chci třeba smazat a to tady u toho není :-(
Toto musíš doprogramovat.
Radek9
Profil
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
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
Kajman:
Ano chtěl bych smazat všechny řádky které odpovídají podmínce výběru
Kcko
Profil
Jarda0001:
Řešení máš v [#17] Radek9

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0