MySQL 查询结果,其中 JSON 编码数据为 LIKE


MySQL querying result where JSON encoded data is LIKE

在我有机会以另一种方式浏览和存储这些数据之前,我的一些数据存储为JSON编码数组。我需要对此数据执行查询:

$query = 'jones';
$inv = $db->select("
  SELECT ID, OrderData FROM store_orders 
  WHERE ShippingData LIKE '%$query%' LIMIT 5"); 

ShippingData的内容如下所示:

{"ShippingFirstName":"Bob","ShippingLastName":"Jones","ShippingAddress":"123 Main St","ShippingAddress2":"Apt B","ShippingCity":"Mytown","ShippingState":"FL","ShippingZip":"12345","ShippingCountry":"US","ShippingPhone":"","ShippingEmail":"my@email.com"}

我试图通过仅对ShippingLastName字段执行查询来最大程度地减少误报结果。我试过了:

$inv = $db->select("
  SELECT ID, OrderData FROM store_orders 
  WHERE ShippingData LIKE ''"ShippingLastName'":'"%$query%'"' LIMIT 5"); // Escaping double quotes

只是这没有返回任何结果。有什么想法吗?

感谢@Mat的帮助,这就是答案。我在开头和结尾都没有通配符:

$inv = $db->select("
  SELECT ID, OrderData FROM store_orders 
  WHERE ShippingData LIKE '%'"ShippingLastName'":'"%$query%'"%' LIMIT 5"); // Escaping double quotes

现在,这非常有效。

你需要用通配符%包围整个模式。 无需包含或转义引号。 这应该这样做:

$inv = $db->select("
    SELECT ID, OrderData FROM store_orders 
    WHERE ShippingData LIKE '%ShippingLastName___$query%' LIMIT 5");

WHERE条件周围缺少通配符。它应该是这样的:

SELECT ID, OrderData FROM store_orders WHERE ShippingData LIKE '%'"ShippingLastName'":'"%$query%'"%' LIMIT 5

您可以使用 like 运算符添加任意数量的通配符%字符。此处的文档 : https://dev.mysql.com/doc/refman/5.5/en/string-comparison-functions.html#operator_like

您也可以尝试使用此语法以提高可读性(转义双引号)

SELECT ID, OrderData FROM store_orders WHERE ShippingData LIKE '%"ShippingLastName":"%$query%"%' ESCAPE '"' LIMIT 5