Wählen Sie eine eindeutige Spalte, andere können nicht unterscheiden. - MySQL
-
26-09-2019 - |
Frage
Ok ich eine temporäre Tabelle mit 135.000 Zeilen, ich versuche, einige der Werte aus dieser temporären Tabelle in andere Tabellen einzufügen.
Dies ist das Schema verwende ich
tvtemptable
+-------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| PROGTITLE | text | YES | | NULL | |
| SUBTITLE | text | YES | | NULL | |
| EPISODE | text | YES | | NULL | |
| YR | year(4) | YES | | NULL | |
| DIRECTOR | text | YES | | NULL | |
| PERFORMERS | text | YES | | NULL | |
| PREMIERE | tinyint(1) | YES | | NULL | |
| FILM | tinyint(1) | YES | | NULL | |
| RPEAT | tinyint(1) | YES | | NULL | |
| SUBTITLES | tinyint(1) | YES | | NULL | |
| WIDESCREEN | tinyint(1) | YES | | NULL | |
| NEWSERIES | tinyint(1) | YES | | NULL | |
| DEAFSIGNED | tinyint(1) | YES | | NULL | |
| BNW | tinyint(1) | YES | | NULL | |
| STARRATING | tinyint(4) | YES | | NULL | |
| CERTIFICATE | varchar(5) | YES | | NULL | |
| GENRE | varchar(50) | YES | | NULL | |
| DESCRIPTION | text | YES | | NULL | |
| CHOICE | tinyint(1) | YES | | NULL | |
| PROGDATE | date | YES | | NULL | |
| STARTIME | time | YES | | NULL | |
| ENDTIME | time | YES | | NULL | |
| DURATION | int(11) | YES | | NULL | |
| CHANNELID | int(11) | NO | | NULL | |
+-------------+-------------+------+-----+---------+-------+
Kanäle
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| CHANNELID | int(11) | NO | PRI | NULL | auto_increment |
| CHANNELNAME | varchar(50) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
Genre
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| GENREID | int(11) | NO | PRI | NULL | auto_increment |
| GENRENAME | varchar(50) | YES | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
Programm
+-------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------+------+-----+---------+----------------+
| PROGRAMMEID | int(11) | NO | PRI | NULL | auto_increment |
| GENREID | int(11) | NO | MUL | NULL | |
| PROGTITLE | text | YES | | NULL | |
| YR | year(4) | YES | | NULL | |
| DIRECTOR | text | YES | | NULL | |
| PERFORMERS | text | YES | | NULL | |
| FILM | tinyint(1) | YES | | NULL | |
| WIDESCREEN | tinyint(1) | YES | | NULL | |
| BNW | tinyint(1) | YES | | NULL | |
| CERTIFICATE | varchar(5) | YES | | NULL | |
| DESCRIPTION | text | YES | | NULL | |
+-------------+------------+------+-----+---------+----------------+
Folge
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| EPISODEID | int(11) | NO | PRI | NULL | auto_increment |
| PROGRAMMEID | int(11) | NO | MUL | NULL | |
| SUBTITLE | text | YES | | NULL | |
| EPISODE | text | YES | | NULL | |
| DIRECTOR | text | YES | | NULL | |
| PERFORMERS | text | YES | | NULL | |
| DESCRIPTION | text | YES | | NULL | |
+-------------+---------+------+-----+---------+----------------+
channelprogramme
+--------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+------------+------+-----+---------+----------------+
| CHANNELPROGRAMMEID | int(11) | NO | PRI | NULL | auto_increment |
| CHANNELID | int(11) | NO | MUL | NULL | |
| PROGRAMMEID | int(11) | NO | MUL | NULL | |
| EPISODEID | int(11) | NO | MUL | NULL | |
| RPEAT | tinyint(1) | YES | | NULL | |
| NEWSERIES | tinyint(1) | YES | | NULL | |
| PREMIERE | tinyint(1) | YES | | NULL | |
| CHOICE | tinyint(1) | YES | | NULL | |
| SUBTITLES | tinyint(1) | YES | | NULL | |
| DEAFSIGNED | tinyint(1) | YES | | NULL | |
| STARRATING | tinyint(4) | YES | | NULL | |
| PROGDATE | date | YES | | NULL | |
| STARTTIME | time | YES | | NULL | |
| ENDTIME | time | YES | | NULL | |
| DURATION | tinyint(4) | YES | | NULL | |
+--------------------+------------+------+-----+---------+----------------+
So ein wenig Hintergrund, die Datenbank ist eine TV-Programmlisten-Datenbank, die channelprogramme Tabelle auf jedem Kanal werden alle Einträge für jede Show enthält, die Programmtabelle enthält eindeutige Einträge für jedes Programm enthält Folge eindeutige Einträge für jede Folge von Programme, die Folgen
habenich glaube, meine Verwirrung ist, ich will die unterschiedlichen progtitles aus der temporären Tabelle wählen Sie die Programmtabelle zu füllen, aber ich mag einige andere Informationen mit ihm zu gehen.
Zum Beispiel, wenn ich tat
select distinct(progtitle) from tvtemptable;
Es würde mir nur gibt den Wert für die progtitle Spalte, während das, was ich will eigentlich die progtitle plus einige andere Sachen.
Also, wenn ich versuche, weitere Informationen wie so wählen
mysql> select distinct progtitle, yr, director, film from tvtemptable
limit 30;
+-----------------------------------+------+---------------------+------+
| progtitle | yr | director | film |
+-----------------------------------+------+---------------------+------+
| Teleshopping | 2000 | | 0 |
| Cinemania | 2000 | | 0 |
| Whose Line Is It Anyway? | 2000 | | 0 |
| Just Desserts | 2004 | Kevin Connor | 1 |
| Law & Order | 2000 | Matthew Penn | 0 |
| Jane Doe: Yes, I Remember it Well | 2006 | Armand Mastroianni | 0 |
| CSI: NY | 2000 | David Jackson | 0 |
| CSI: Crime Scene Investigation | 2000 | Kenneth Fink | 0 |
| NCIS | 2000 | Colin Bucksey | 0 |
| CSI: Miami | 2000 | | 0 |
| Enter the Dragon | 1973 | Robert Clouse | 1 |
| Close | 2000 | | 0 |
| My Son Is Innocent | 1996 | Larry Elikann | 1 |
| Law & Order | 2000 | Christopher Misiano | 0 |
| Murder 101 | 2006 | Christian I Nyby II | 1 |
| CSI: NY | 2000 | Christine Moore | 0 |
| CSI: Crime Scene Investigation | 2000 | Bill Eagles | 0 |
| Rush Hour | 1998 | Brett Ratner | 1 |
| Dark Blue | 2000 | Jeffrey Hunt | 0 |
| CSI: Crime Scene Investigation | 2000 | Richard J Lewis | 0 |
| Ordinary Miracles | 2005 | Michael Switzer | 1 |
| Law & Order | 2000 | Jace Alexander | 0 |
| Wounded Heart | 1995 | Vic Sarin | 1 |
| CSI: NY | 2000 | Jonathan Glassner | 0 |
| Dark Blue | 2000 | Nathan Hope | 0 |
| Blade: The Series | 2000 | Michael Robison | 0 |
| K-Ville | 2000 | Kevin Dowling | 0 |
| Law & Order | 2000 | Jim Ellis | 0 |
| Reasons of the Heart | 1996 | Rick Jacobson | 1 |
| CSI: NY | 2000 | Anthony Hemingway | 0 |
+-----------------------------------+------+---------------------+------+
Es wird ein paar Duplikate in der progtitle Spalte sein. Die Programme sind nicht für jeden neuen Direktor wiederholt, gibt es verschiedene Direktoren oben für einige der Programme, da diese Programme haben Folgen.
Jetzt habe ich es geschafft, die richtig Arbeit wählen, wenn ich nur eine zusätzliche Spalte zum Beispiel benötigen
select distinct
t1.progtitle,
(select
t2.director
from
tvtemptable t2
where
t1.progtitle = t2.progtitle
limit 1) as "Director"
from
tvtemptable t1 limit 10;
+-----------------------------------+--------------------+
| progtitle | Director |
+-----------------------------------+--------------------+
| Teleshopping | |
| Cinemania | |
| Whose Line Is It Anyway? | |
| Just Desserts | Kevin Connor |
| Law & Order | Matthew Penn |
| Jane Doe: Yes, I Remember it Well | Armand Mastroianni |
| CSI: NY | David Jackson |
| CSI: Crime Scene Investigation | Kenneth Fink |
| NCIS | Colin Bucksey |
| CSI: Miami | |
+-----------------------------------+--------------------+
Natürlich wird diese chaotisch Wenn ich mehr als eine zusätzliche Spalte auswählen möchten
Also, was ist der beste Weg, dies zu tun?
Das ist mein Befehl insert die Programmtabelle aus der temporären Tabelle für bevölkern, die derzeit es das gleiche Problem mit Duplikaten in der Auswahl Beispiel hat ich oben gab.
INSERT INTO PROGRAMME (
PROGTITLE, GENREID, YR, DIRECTOR,
PERFORMERS, FILM, WIDESCREEN, BNW,
CERTIFICATE, DESCRIPTION)
SELECT DISTINCT
T.PROGTITLE, G.GENREID, T.YR, T.DIRECTOR,
T.PERFORMERS, T.FILM, T.WIDESCREEN, T.BNW,
T.CERTIFICATE, T.DESCRIPTION
FROM
TVTEMPTABLE T
INNER JOIN GENRE G ON G.GENRENAME=T.GENRE
LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE
WHERE
P.PROGTITLE IS NULL
Lösung
Habe ich Recht davon ausgehen, dass Ihr TVTEMPTABLE
das Ergebnis einer Join von Tabellen von irgendwo?
Wenn das der Fall ist, glaube ich, werden Sie insgesamt einen leichten Job, wenn Sie zuerst Split, dass temporäre Tabelle in mehr temporären Tabellen, die das gleiche Format wie Ihre Zieltabellen haben.
Zum Beispiel (und ich weiß nicht, Ihre Daten so dass ich denke nur):
-- All genres (matches your existing genres table)
create table genres_temp as
select distinct genre
from tvtemptable;
-- All programmes (matches your existing programme table)
create table programmes_temp as
select distinct all_the_programme_columns
from tvtemptable;
-- Contains the many-to-many relationship between genres and programmes
create table programme_genre_temp as
select distinct genre, progtitle
from tvtemptable;
Das oben nicht beantwortet Ihre Frage, aber es kann Ihnen ein paar Ideen, die das Problem wegnimmt, die die Programminformationen zu sein scheint für jede wiederholt wird etwas . Sie müssen herausfinden, was es ist.
Aktualisiert So wird jedes Programm einmal für jeden Regisseur wiederholt? Dann mein obiger Ansatz macht noch mehr Sinn. Entitäten extrahiert und Beziehungen ersten
Aktualisiert vor 2
Hmm, du kraft- Direktor in Programm, wenn Regisseur der Folge hat? Das wäre ein Modellfehler scheint es. Wie auch immer, wenn Sie mich nicht, was Regisseur Sie wählen, können Sie Gruppe auf progtitle
und Verwendung MAX()
um alle anderen Spalten. Das gibt Ihnen verschiedene progtitles und einer der Werte für den Rest der Spalten.
SELECT T.PROGTITLE, max(G.GENREID), max(T.YR), max(T.DIRECTOR), etc
FROM TVTEMPTABLE T
INNER JOIN GENRE G ON G.GENRENAME=T.GENRE
LEFT JOIN PROGRAMME P ON P.PROGTITLE=T.PROGTITLE
WHERE P.PROGTITLE IS NULL
group by T.PROGTITLE;
Andere Tipps
Das macht keinen Sinn. Wie kann eine Reihe teilweise deutlich und teilweise nicht verschieden? Denken Sie an das ausgewählte Ergebnis als Tabelle - wie würden Sie die Daten darstellen, wenn es einen Wert für PROGTITLE
ist, die mehrere Werte für den Rest der Spalten
Diese beantworten Ihre Frage nicht, aber wahrscheinlich wird hier die für Menschen googeln ihre Art und Weise beantworten:
In Postgresql, können Sie dies mit SELECT DISTINCT ON, zum Beispiel:
SELECT DISTINCT ON (p.progtitle) p.* FROM progtitle p;
Ich weiß nicht, von einem gleichwertigen für MySQL.
Insert into xx (a,b)
Select a.ab, b.bb from (
Select distinct ab from a) a, (select distinct bb from b) b
Ich lese das, was Sie wollen eine Liste von verschiedenen Programmen, aber mit einigen zugehörigen Daten in anderen Spalten für Kontext? Sie können dies tun, mit Zeilennummern.
select * from
(select *,
row_number() over (partition by progtitle order by year desc) N
from tvtempta) t
where t.N = 1
Noch besser ist, können Sie die order by
Klausel verwenden, um die neuesten zuerst angeben oder eine andere bevorzugte Art der Wahl, die Zeile, die Sie wollen. Dies ist die T-SQL-Syntax und ich denke, die gleiche Syntax in Oracle funktionieren soll (wenn es nicht in Oracle auf jeden Fall möglich ist). Leider weiß ich nicht, wenn Sie dies in MySQL tun können.