【问题标题】:Read mysql table until first comma读取 mysql 表直到第一个逗号
【发布时间】:2011-07-23 23:04:15
【问题描述】:

我有这个问题:

$sql = "SELECT * FROM tutorials WHERE ( device LIKE '%".$device."%' AND version LIKE '%".$version."%' AND firmware LIKE '%".$firmware."%' ) LIMIT 1";

桌子:

device | a, b, c, d
version | 2, 3, 4
firmware | 5

现在我想从设备(a)、版本(2)和固件(5)中获取第一个字符串,直到第一个逗号,或者如果没有逗号则整个文本。

我想到了explode(),但我真的不知道。我更喜欢 php,因为我想回显数字。

【问题讨论】:

  • 规范化你的数据模型,这不是必须的。每当您尝试在数据库中实现自己的微数据库时,都会出现问题。
  • 这里是 explode() 用法的示例:$devices = explode(',', 'a, b, c, d'); echo trim($devices[0]); 将打印一个。
  • @yitwail: 没什么问题...我猜 :)
  • @Dor,就 php 语法而言没有错。至于数据库设计,这是一个单独的问题。 :)

标签: php mysql explode


【解决方案1】:

MySQL 解决方案:

SELECT  SUBSTRING_INDEX(`device`, ',', 1),
    SUBSTRING_INDEX(`version`, ',', 1),
    SUBSTRING_INDEX(`firmware`, ',', 1)
FROM `tutorials` WHERE `id`=123 LIMIT 1 /*
    Why LIMIT? `id` should be unique */

PHP解决方案:

function first_value($str) {
    $pos = strpos($str, ',');
    if ($pos !== false)
        return substr($str, 0, $pos);
    return $str;
}
$q = mysql_query('SELECT * FROM `tutorials` WHERE `id`='. (int)$id .' LIMIT 1 ');
$arr = mysql_fetch_array($q);

$arr['device'] = first_value($arr['device']); // etc

但正如 Kerrek SB 所说,您应该真正规范化您的表。

【讨论】:

  • 为未规范化的 CSV 列量身定制的,适用于那些讨厌创建一个新表的人,该表只有一列来保存不同表的值,或者在这种情况下为 3 个表用于设备、版本、和固件
猜你喜欢
  • 2013-12-16
  • 2015-02-02
  • 2012-06-29
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多