2013-04-02 3 views
5

Ich habe eine Tabelle in MySql, wo ich einige Daten speichern lassen Sie uns eine name und eine stand annehmen. Ich weiß, dass die Stände von 1 bis 100 sein werden, ich möchte jene Stände auswählen, die nicht genommen werden. Zum Beispiel nehmen wir an, dass whe nur 5 steht und diese Tabelle:Wählen Sie nur die Zahlen, die in Array sind und nicht in einer Tabelle

| name | stand | 
-------------------- 
| test | 1 | 
| anot | 3 | 
| blah | 4 | 
| uuuh | 5 | 

in diesem Fall die einzige freie Stand wird die 2 sein.

Gibt es eine Anweisung, das zu tun? ... Ich dachte an die Klausel NOT IN, aber ich kann den Code nicht herausfinden ... vielleicht, wenn ich am Array in MySql definieren kann?

+1

Wenn Sie es wissen, und kann alle 'stand' der in seiner eigenen Reihe bekommen, können Sie etwas tun wie '$ freeStands = array_diff (range (1.100), $ idArray));' – Jon

+0

oh ... außerhalb der sql ... ich habe nicht darüber nachgedacht, danke, es sollte eine Lösung –

+0

' $ taken_stands = sein Array (1, 2, 3, 5, 7); echo $ ids = explodieren (",", $ genommen_stand); $ sql = "... WO STEHT NICHT IN ($ ids)"; ' –

Antwort

2

Wenn Sie wissen, die Werte von 1 bis 100 sind, dann können Sie dies tun:

select n.num 
from (select d1.d*10 + d2.d as n 
     from (select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all 
      select 5 union all select 6 union all select 7 union all select 8 union all select 9 
      ) d1 cross join 
      (select 0 as d union all select 1 union all select 2 union all select 3 union all select 4 union all 
      select 5 union all select 6 union all select 7 union all select 8 union all select 9 
      ) d2 
    ) nums left outer join 
     stands s 
     on s.stand = nums.n cross join 
     (select min(stand) as minstand and max(stand) as maxstand from stands) const 
where s.stand is null and nums.n between minstand and maxstand; 

Dies ist nicht getestet, so dass es Syntaxfehler haben.

Erstellen Sie eine Tabelle mit allen möglichen Werten (1 bis 100). Linke dies zu deinem Tisch. Dies gibt Ihnen alle Nummern, die nicht verwendet werden. Sie möchten es jedoch auf die Min- und Max-Werte beschränken, also berechnen Sie diese und verwenden Sie sie zum Filtern.

1

Sie können eine Tabelle mit Ganzzahlen verwenden, um eine Reihe von Zahlen zu erhalten.

Sprich: -

SELECT a.i + b.i * 10 + c.i * 100 FROM integers a, integers b, integers c 

mit einem Tisch namens ganzen Zahlen mit einer einzigen Spalte i genannt, mit 10 Reihen mit den Werten von 0 bis 9, dass Sie alle Zahlen zwischen 0 erhalten und 999 (man kann leicht treten Sie noch ein paar Mal gegen den Tisch, um größere Zahlen zu erhalten).

könnten Sie kommen, dass gegen Sie Tabelle sind die nicht verwendeten Zahlen zu finden: -

SELECT * 
FROM (SELECT a.i + b.i * 10 + c.i * 100 AS anInt FROM integers a, integers b, integers c) Sub1 
LEFT OUTER JOIN someTable 
ON Sub1.anInt = someTable.stand 
WHERE someTable.stand IS NULL 

Dies funktioniert, sondern geben Ihnen alle Zahlen entweder Ende des Bereichs als auch im Stand. für diese müssen Sie gegen die Min- und Max-meiner Meinung nach

SELECT Sub1.anInt 
FROM (SELECT a.i + b.i * 10 + c.i * 100 AS anInt FROM integers a, integers b, integers c) Sub1 
INNER JOIN (SELECT MIN(stand) AS MinStand, MAX(stand) AS MaxStand FROM someTable) Sub2 
ON Sub1.anInt >= Sub2.MinStand AND Sub1.anInt <= Sub2.MaxStand 
LEFT OUTER JOIN someTable 
ON Sub1.anInt = someTable.stand 
WHERE someTable.stand IS NULL 
1

Eine einfachere Lösung, verbinden, wäre eine Tabelle zu haben, mit der ganzen Zahl zwischen eins und 100. Dann wird eine linke Sie aus dieser Tabelle beitreten die Stehtabelle und zeigt Werte an, die nicht übereinstimmen.

Sie könnten eine Tabelle namens "integer_values" mit einem Feld namens "value" erstellen. Dann füllen Sie es mit allen Zahlen von 1 bis 100. Dann könnten Sie die folgende Abfrage verwenden:

SELECT i.value 

FROM integer_values AS i 

     LEFT JOIN stands AS s 
     ON i.value = s.stand 

WHERE s.stand IS NULL 
+0

das könnte der richtige Ansatz sein, aber ich habe keinen Zugriff auf die db-Struktur, also konnte ich keine Tabelle ändern: / –

Verwandte Themen