【问题标题】:PHP Select and Separate itemsPHP 选择和分离项目
【发布时间】:2013-06-21 11:34:41
【问题描述】:

我在 MySQL 中有下表:

表名: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 不是很熟悉。请帮忙!

【问题讨论】:

  • 您可以使用 intval() 获取字符串的 int 值
  • 1000 指的是什么?如果是数量阈值,那strlen和它有什么关系?
  • 好笑,好像有人刚刚问了类似的问题...stackoverflow.com/questions/17284386/mysql-compare-two-columns
  • @MarcelloRomani strlen 计算字符,所以我 1l900bk 是 7 而 1l1000bk 是 8..我想 select strlen = 8 的项目...这有什么意义?
  • 这本身就很有意义。但是strlen(item_no) 与此有何关联:“包含小于 1000 的项目和大于 1000 的其他文件”?

标签: php mysql database select


【解决方案1】:

模式:1l900fu

两个字符,后跟数字,然后是一些字母。

使用substr()获取前两个字母后面的字符串。

那么你将有 900fu。

然后使用正则表达式只抓取数字,但不包括它遇到的第一个 alpha。这给你留下了:

900.

然后使用intval()

创建两个数组,如果intval()

从这两个数组中构建你想要的输出。

或者你是否因为某种原因必须在 MySQL 中做所有事情?

【讨论】:

  • 如果您知道正则表达式总是以数字前的两个字符开头,则可以使用正则表达式完成所有操作。
  • 你的想法行得通。如果 item_no like 12l1000bk 在字母前包含两个数字怎么办。我不认为substr 是正确的选择?
  • 那么你最初描述的模式已经改变了。在这种情况下,我能看到的唯一模式是:从字符串的开头,继续直到找到字母,跳过它,捕获所有数字,直到但不包括 alpha。您需要一个可靠的数据集、正则表达式和preg_match() 来解决您的问题。
  • separate the item_no based on strlen 怎么样?性能将是不在循环内使用所有那些(昂贵的)字符串函数和正则表达式的一个很好的理由,而是在 mysql 中完成所有这些......特别是如果记录数量增加,性能差异将变得非常明显!跨度>
  • 我会在此基础上添加,我认为如果 item_no 为 50 或 10,000,如果您基于 strlen,您的解决方案将会中断@
【解决方案2】:

我认为您正在寻找相当于 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

【讨论】:

  • 我已经尝试了上面的代码,但我得到了以下错误:mysql_fetch_assoc() expects parameter 1 to be resource, boolean given.
  • 我的错,where必须是havingoff。将纠正我的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2022-01-06
  • 2011-11-19
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多