2013-06-24 57 views
2

我在MySQL中,下表:PHP選擇並單獨項目

表名:all_items


item_no qty 
1l900fu 1 
1l950be 2 
1l1000bk 3 
1l1020rd 5 
1l1200fu 7 

我需要做兩個選擇,其中應該輸出兩個不同的CSV文件如下:

CSV file 1          CSV file 2 
    item_no qty          item_no qty 
    1l900fu 1          1l1000bk 3 
    1l950be 2          1l1020rd 5 
                1l1200fu 7 

根據上表,字符串包含數字和字母,所以我想到做一個strlen,但我不知道如何將它放在查詢語句中:

//CSV file 1 

$result = mysql_query("SELECT item_no, qty FROM all_items ORDER BY item_no Asc"); 

//Excuting Values from Mysql to CSV 
$row = 1; // 1-based index 
while($row_data = mysql_fetch_assoc($result)) { 

    $col = 0; 
//Row Values 
    foreach($row_data as $key=>$value) { 
     $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, $row, $value); 
     $col++; 
    } 
    $row++; 
} 

任何想法它可能工作?我想根據strlen分開item_no

對不起,我不熟悉PHP。請幫忙!

+0

你可以使用INTVAL()得到一個字符串 – Fallen

+0

是什麼1000指的int值?如果它是數量閾值,那麼'strlen'與它有什麼關係? –

+0

有趣,看起來像別人只是問了一個類似的問題... http://stackoverflow.com/questions/17284386/mysql-compare-two-columns –

回答

1

模式:1l900fu

兩個字符,後面的號碼,然後通過一些字母。

使用substr()獲取前兩個字母后的字符串。

然後你會有900fu。

然後使用正則表達式只抓取數字,但不包括遇到的第一個alpha。這使您:

然後使用intval()

創建兩個數組,如果intval()是< 1000,推到第一陣列,否則,推到第二陣列。

無論你想從這兩個數組中構建你的輸出。

或者你是否因爲某些原因需要在MySQL中做所有事情?

+0

如果你想知道它總是以兩個字符開頭,那麼可以用正則表達式來完成整個事情。 –

+0

你的想法有效。如果item_no像'12l1000bk'在字母之前包含兩個數字會怎樣。我不認爲'substr'會是正確的選擇? – Alihamra

+0

然後你最初描述的模式已經改變。在這種情況下,我可以看到的唯一模式是:從字符串開頭繼續,直到找到字母,跳過它,捕獲所有數字直到但不包括alpha。你需要一個可靠的數據集,正則表達式和'preg_match()'來解決你的問題。 –

0

我認爲您正在尋找相當於php strlen的mysql LENGTH()函數。您的查詢會是這個樣子:

csv1:

SELECT item_no, qty, LENGTH(item_no) as length 
FROM all_items 
HAVING length = 7 
ORDER BY item_no ASC 

CSV2:

SELECT item_no, qty, LENGTH(item_no) as length 
FROM all_items 
HAVING length = 8 
ORDER BY item_no ASC 
+0

我試過上面的代碼,但我得到了以下錯誤:'mysql_fetch_assoc()期望參數1是資源,布爾給定'。 – Alihamra

+0

我的不好,'哪裏'必須'有'當然。將糾正我的答案! – Pevara