2013-06-24 45 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