2016-03-28 8 views
1

Mein Kopf dreht sich bereits davon und ich brauche deine Hilfe.MySQL - wie man große Bedingungen optimiert

MY DATABASE

  • importierte CSV-Datei: 22 Spalten und 11k Reihen
  • 2 Tabellen mit den gleichen Daten (beide aus der CSV erstellt)
  • Added ID als PRIMÄRSCHLÜSSEL zu beiden
  • Alle VARCHAR (60) Einige Spalten sind leere Strings ''

DB:

PID | CODE 1 | CODE 2 | CODE 3 | CODE 4 | CODE 5 | CODE X (up to 9) | ID 
------------------------------------------------------------------------- 
    1 | a | b | c |  |  |     | 1 
    2 | a |  | b | d |  |     | 2 
    3 | x |  |  |  |  |  y   | 3 
  • DB hat 22 Spalten, aber ich bin auch nur CODE Spalten (bis zu) in denen ich in Bezug auf SQL-Anweisung interessiert sein könnte.
  • Es wird nur Tabelle lesen - MyISAM-Engine dann?

Was ich tun

select PID = 1 from first table 
and retrieve all PIDs from second table 
IF 
    selected PID's column CODE 1 
    or 
    selected PID's column CODE 2 (which is b) etc (up to 9). 
    = any PID's CODE X 

Also sollte ich nur PID 2.

edit: PID kein ID ist, es ist nur ein Beispielcode, Es könnte String sein: '002451' und ich suche nach anderen PIDs mit den gleichen CODES (zB PID1 hat code = a also sollte es PID2 finden, weil eine seiner CODE Spalten enthält a)

mein Versuch

SELECT a.* FROM `TABLE1` a WHERE 
(
    SELECT * FROM `TABLE2` b WHERE b.`PID` = 1 
    AND 
    (
    (b.`CODE 1` NOT IN ('') AND IN (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...)) OR 
    (b.`CODE 2` NOT IN ('') AND (a.`CODE 1`,a.`CODE 2`, A.`CODE 3`...)) OR... 

ich mit großer Abfrage würde am Ende - über 81 Bedingungen. In Bezug auf die Leistung ... nun, es funktioniert nicht.

Ich weiß intuitiv, dass ich sollte:

  • Verwendung INDIZES (auf CODE 1/CODE 2/CODE 3 usw.?)
  • JOIN ON (aber ich bin zu blöd) - Deshalb habe ich 2 Tabellen erstellt (nehmen wir an, ich möchte nicht TEMP. TABELLEN)

Wie schreibe ich die SQL/Design der DB effizient?

+0

Korrigieren Sie Ihre Datenbank so, dass pro 'pid' und' code' eine Zeile steht. Haben mehrere Spalten mit den gleichen Daten ist fast nie die richtige Lösung. –

+0

Könntest du ein wenig näher ausführen? Eine Zeile pro PID und eine Zeile pro Code? Oder um diese 22 Spalten auf nur die benötigten zu reduzieren. – SQLnoob

Antwort

1

Dies ist zu lang für einen Kommentar.Die richtige Datenstruktur ist eine Zeile pro pid und code. Der einfachste Weg ist:

Dann haben Sie die Werte in einer einzigen Spalte und es ist viel einfacher, nach übereinstimmenden Codes zu suchen.

In der Praxis Sie drei Tabellen haben sollte:

create table Codes (
    CodeId int not null auto_increment primary key, 
    Code varchar(255) 
); 

create table PCodes (
    pid int not null, 
    codeid int not null, 
    constraint fk_PCodes_pid references p(pid), 
    constraint fk_PCodes_codeid references codes(codeid); 
); 

Wenn die Reihenfolge der Codes ist wichtig für jeden „p“, schließen dann eine priority oder ordering Spalte in der Tabelle PCodes.

+0

Oh ok - also sollte ich diese Tabelle so umschreiben: 'ID' ->' PID' -> 'CODE' (eine Spalte mit mehreren Werten, die einer 'ID' zugeordnet sind), ist das richtig? – SQLnoob

+0

@ SQLNOOB. . . Ich denke, das ist die richtige Idee. –

Verwandte Themen