2013-04-02 32 views
5

我在MySql中有一個表,我保存了一些數據,我們假設一個name和一個stand。 我知道看臺會從1號到100號,我想選擇那些沒有采用的看臺。例如,讓我們假設磨片只有5架,這表:在這種情況下只選擇那些在數組中,而不在表中的數字

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

唯一的自由立場將是2

是否有聲明要這麼做? ...我在考慮條款NOT IN,但我無法弄清代碼......也許如果我可以在MySql中定義數組?

+1

如果你知道的話,並且可以得到所有'stand'在各自的陣列中,你可以做一些事情像'$ freeStands = array_diff(範圍(1,100),$ idArray));' – Jon

+0

哦......外面的SQL ...我沒有想到它,謝謝,它應該是一個解決方案 –

+0

' $ taken_stands =數組(1,2,3,5,7); echo $ ids = explode(「,」,$ taken_stands); $ sql =「... WHERE STANDS NOT IN($ ids)」;' – 2013-04-02 12:47:32

回答

2

如果你知道的值是從1到100,那麼你可以這樣做:

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; 

這不是測試,因此它可能有語法錯誤。

即,創建一個包含所有可能值(1到100)的表格。左邊加入這個到你的表。這給你所有未使用的數字。然而,你想限制它的最小值和最大值,所以計算這些值並將它們用於過濾器。

1

您可以使用整數表來獲得一系列數字。

說: -

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

與一列稱爲我的表叫整數,10行與值0到9,將讓你在0和999之間的所有數字(你可以很容易地再次加入桌子以獲得更大的數字)。

您可以加入,對你表中查找未使用的數字: -

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 

這是可行的,但會給你所有的號碼在待機範圍的兩端爲好。對於這些,你需要加入對最小和最大

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

一個簡單的辦法,在我看來,將有一個表的所有一個和100之間的號碼,然後做一個左從該表加盟看臺和顯示任何不匹配的值。

您可以使用名爲「value」的字段創建一個名爲「integer_values」的表。然後,所有的數字從1填充它到100那麼你可以使用下面的查詢:

SELECT i.value 

FROM integer_values AS i 

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

WHERE s.stand IS NULL 
+0

這可能是正確的方法,但我沒有訪問數據庫結構,所以我不能改變任何表:/ –

相關問題