【问题标题】:how to select all data from mysql table where column is an array or single and my value match with one item of this array?如何从 mysql 表中选择所有数据,其中列是数组或单个并且我的值与该数组的一项匹配?
【发布时间】:2013-10-11 16:06:04
【问题描述】:

请有人帮助我吗?我想选择mysql表中的所有值,其中我要检查的列与值或值数组混合......所以更清楚地说,我有一个表来存储来自许多人的所有消息发件人到一个或多个收件人....

我的功能是

public static function find_messagesTo_by_user_id($mess_to=0) {
          global $database;
          $mess_to = $database->escape_value($mess_to);
          $sql  = "SELECT * FROM ".self::$table_name;
          $sql .= " WHERE mess_to = '{$mess_to}'";
          $sql .= " AND mess_deleted = 0";
          $sql .= " ORDER BY mess_created_date DESC";
          $result_array = parent::find_by_sql($sql);
          return $resultrray;
      }

所以 'mess_to ' 有数组和单个值 .... 它们只是数字,例如 (1, 15, 25 ,26 ,27 , array(1,25, 27) , 31, 42, ..... ..)

拜托,我想破头了:)

我在等待任何帮助吗?

【问题讨论】:

  • 这太疯狂了!能给个 print_r($mess_to);

标签: php mysql


【解决方案1】:

以@Maluchi 的回答为基础。确保您的数据如下所示:

| mess_to         |
+-----------------+
| ,123,           |
| ,123,456,152,1, |
| ,456,567,       |
| ,3,             |

所以将, 中的每个值都包围起来。那么你可以放心地做:

WHERE `mess_to` LIKE "%,{$mess_to},%"

这确保$mess_to = 1 将只匹配第二行,而不是第一行。


您还可以对数据进行非规范化并为JOIN 制作一个表格。

【讨论】:

    【解决方案2】:

    如果我没看错的话,$mess_to 会被传递到函数中,并且可以包含单个值,也可以在数组中传递。

    当匹配多个值时,SQL 应该寻找一个逗号分隔的列表。 where 子句需要在列表中,而不是在列表中。

    试试:

    public static function find_messagesTo_by_user_id($mess_to=0) {
          global $database;
          $mess_to = $database->escape_value($mess_to);
          $sql  = "SELECT * FROM ".self::$table_name;
          $sql .= " WHERE mess_to IN (" . implode(',', $mess_to) . ")";
          $sql .= " AND mess_deleted = 0";
          $sql .= " ORDER BY mess_created_date DESC";
          $result_array = parent::find_by_sql($sql);
          return $resultrray;
      }
    

    请特别注意这一行:

    $sql .= " WHERE mess_to IN (" . implode(',', $mess_to) . ")";
    

    使用 geomagas 的 cmets 编辑的代码! (谢谢geomagas!)

    【讨论】:

    • 好主意!但是有两件事:1)IN 需要括号,而不是引号;2)你应该 implode() recursively
    • 哦,第三个:implode(',',array($mess_to)) 将涵盖单值情况(提供上述递归性)。
    • 请看之前的评论。
    • 不确定我的编辑是否涵盖第 2 点。我也没有将问题解读为传入包含数组的数组。也许我读错了。
    • 嗯,不,它没有。请参阅this fiddle 中的示例。
    【解决方案3】:

    假设你的专栏是这样的

    | mess_to |
    +---------+
    | 1       |
    | 1,2,3,4 |
    | 2       |
    | 3       |
    

    您可以使用LIKE 运算符:

    $sql .= " WHERE mess_to LIKE '%{$mess_to}%'";
    

    这将匹配mess_to 具有$mess_to 字符串值的每一行(您的列数据类型应该是字符串才能工作)。

    【讨论】:

    • 但是如果你有11,12,13 会匹配$mess_to = 1 吗? (或23
    • 不错,没想到
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2020-08-31
    • 1970-01-01
    • 2012-03-29
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多