0

请问有人可以帮我吗?我想选择 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, ..)

拜托,我打破了我的头:)

我在等待任何帮助?

4

3 回答 3

1

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

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

所以将每个值包围在,. 那么您可以安全地执行以下操作:

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

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


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

于 2013-10-11T16:17:51.003 回答
1

如果我没看错,$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 的评论编辑的代码!(谢谢geomagas!)

于 2013-10-11T16:20:13.517 回答
0

假设你的专栏是这样的

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

您可以使用LIKE运算符:

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

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

于 2013-10-11T16:14:28.850 回答