在SQL中搜索列中的数据行

时间:2012-01-07 18:31:06

标签: php mysql sql regex

好的 - 因为我似乎在困扰人们的目标,我将提供这个起点:

SELECT `car_data` FROM `parts` WHERE `car_data` LIKE '%|2011|ford|%'

此Statement返回适用于2011 ford的每个部分的car_data。这些行中的一个看起来像:

61156|SUV|2003|FORD|EXCURSION||6.0L DIESEL V8||||
61156|SUV|2011|FORD|EXCURSION||6.0L DIESEL V8||||
61156|SUV|2005|FORD|EXCURSION||6.0L DIESEL V8||||
61156|Truck|2001|GMC|SIERRA 2500 HD||6.6L DIESEL V8||||
61156|Truck|2002|GMC|SIERRA 2500 HD||6.6L DIESEL V8||||
61156|Truck|2007|DODGE|RAM 3500 PICKUP|ST|5.9L DIESEL L6||||
61156|Truck|2007|DODGE|RAM 3500 PICKUP|TRX4|5.9L DIESEL L6||||
61156|Truck|2003|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||
61156|Truck|2011|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||
61156|Truck|2005|FORD|F-250 SUPER DUTY PICKUP||6.0L DIESEL V8||||

请注意,此特定部分也适用于其他汽车(大部分都适用)。从我上面的SQL调用返回的每行数据都返回类似于上述数据的结果。 car_data是一个大文本字段,其中包含上述所有数据。

我需要过滤显示的每一行数据,并仅显示2011年福特的汽车模型(分隔文本中的第5列)。例如:

EXCURSION
F-250 SUPER DUTY PICKUP

4 个答案:

答案 0 :(得分:1)

是的,正如Jake Feasel所指出的那样,数据正常化,或者:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(data, '|', 4),'|',-5) as model
FROM data
GROUP BY SUBSTRING_INDEX(SUBSTRING_INDEX(data, '|', 4),'|',-5)

答案 1 :(得分:0)

我仍然不清楚你需要返回什么,但如果你想要的只是模型而不是“修剪”(因为缺乏更好的描述)那么

SELECT DISTINCT(model) FROM car_info;

然后借用@ Uboonto的解决方案:

SELECT DISTINCT(SUBSTRING_INDEX(SUBSTRING_INDEX(car_data, '|', 4), '|', -5))) from car_info;

应该这样做。

如果MySQL抱怨,那么你应该可以这样做:

SELECT DISTINCT(<not sure what the name would be>) FROM
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(car_data, '|', 4), '|', -5)) from car_info;

答案 2 :(得分:0)

你可以在php中这样做,就像你将每一行拆分成一个数组,然后你将每个数组添加到一个数组中,然后根据你想要的列编写som递归函数排序,你将需要uasort函数。

答案 3 :(得分:0)

编辑 - MySQL

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ci.data, '|', -7),'|',1) from 
(select distinct data from car_info)