2013-04-02 10 views
5

Mam tabelę w MySql, gdzie zapisuję niektóre dane, przyjmijmy name i stand. Wiem, że stoiska będą od 1 do 100, chciałbym wybrać te stoiska, które nie zostały podjęte. Na przykład załóżmy, że trakt mają tylko 5 stoisk i tej tabeli:Wybieranie tylko tych liczb, które są w tablicy I nie są w tabeli

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

w tym przypadku tylko darmowe stoisko będzie 2.

Czy istnieje oświadczenie, aby to zrobić? ... Myślałem o klauzuli NOT IN, ale nie mogę znaleźć kodu ... może jeśli mogę zdefiniować Am Array w MySql?

+1

Jeśli znasz go i możesz uzyskać wszystkie 'stand''s we własnej tablicy, możesz zrobić coś jak '$ freeStands = array_diff (zakres (1100), $ idArray));' – Jon

+0

oh ... poza sql ... nie myślałem o tym, dzięki, powinno to być rozwiązanie –

+0

' $ taken_stands = array (1, 2, 3, 5, 7); echo $ ids = explode (",", $ taken_stands); $ sql = "... GDZIE NIE STAJE W ($ ids)"; ' –

Odpowiedz

2

Jeśli znasz wartości od 1 do 100, to można to zrobić:

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; 

to nie jest badana, więc może mieć błędy składniowe.

Oznacza to, że należy utworzyć tabelę ze wszystkimi możliwymi wartościami (od 1 do 100). Po lewej dołącz do tego stołu. To daje wszystkie numery, które nie są używane. Jednak chcesz ograniczyć go do wartości min i max, więc kalcualte te i użyj ich do filterin.

1

Możesz użyć tabeli liczb całkowitych, aby uzyskać zakres liczb.

Powiedz: -

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

ze stołem nazywa liczb z jednej kolumnie o nazwie I, z 10 wierszy z wartościami od 0 do 9, który będzie Ci wszystkie numery z przedziału od 0 do 999 (można łatwo przyłączyć się do stołu jeszcze kilka razy, aby uzyskać większe liczby).

Można przyłączyć że przeciwko tobie tabeli znaleźć niewykorzystane numery: -

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 

to będzie działać, ale daje wszystkie numery albo końca zakresu w stojaku, jak również. dla nich trzeba dołączyć przeciwko min i max

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

prostsze rozwiązanie, moim zdaniem, byłoby mieć tabelę ze wszystkimi liczbie od jednego do 100. Następnie należy przystąpić w lewo od tej tabeli tabela stoisk i pokaż wszelkie wartości, które nie pasują.

Można utworzyć tabelę o nazwie "wartości_całkowite" za pomocą pola o nazwie "wartość". Następnie zapełnij go wszystkimi liczbami od 1 do 100. Następnie możesz użyć następującego zapytania:

SELECT i.value 

FROM integer_values AS i 

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

WHERE s.stand IS NULL 
+0

to może być właściwe podejście, ale nie mam dostępu do struktury db, więc nie mogłem zmienić żadnego stołu: / –

Powiązane problemy