计算字段中的换行符并按顺序排序

时间:2009-07-24 08:16:46

标签: php mysql

我在表recipes中有一个使用mysql_real_escape_string插入的字段,我想计算该字段中的换行符数,并使用此数字对记录进行排序。

P.S。该领域被称为成分。

谢谢大家

4 个答案:

答案 0 :(得分:5)

这样就可以了:

SELECT *, LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', '')) as Count
FROM Recipes
ORDER BY Count DESC

然而,我获得线路数量的方式有点像黑客,我认为没有更好的方法。如果性能是一个巨大的问题,我建议保留一个具有换行量的列。但是对于中型数据集,我认为上述情况应该没问题。

如果你想拥有一个如上所述的缓存列,你可以这样做:

UPDATE
    Recipes
SET
    IngredientAmount = LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', ''))

之后,无论何时更新/插入新行,您都可以计算金额(可能使用PHP)并在此之前填写此列。或者,如果您遇到这种情况,请尝试triggers

答案 1 :(得分:2)

我在这里做了很多,但是从你在帖子中阅读的内容来看,你可以稍微改变你的数据库结构,并且解决这个问题并打开你的数据集直到更有趣的用途。

如果您将成分分成自己的表格,并使用链接表来索引哪些成分出现在哪些食谱中,那么通过数据操作进行创作会更容易。每份食谱计算成分,在食谱中找到相似之处,搜索含有各种成分的食谱等变得更容易,您的数据也会更加规范化和更小。 (存储所有成分的全局列表与存储每个食谱的集合)

如果您现在使用单个文本输入字段输入配方的成分,您可以执行某些操作,例如按行分解输入并在保存到数据库时使用每一行作为成分。您可以使用PHP的内置levenshtein()similar_text()函数来处理拼写错误的成分名称,并将数据保持为可能的标准化,而无需过多地手工修饰[用户]数据条目

这只是一个建议,随心所欲。

答案 2 :(得分:0)

在这里你的功能和意图有点超出了它。您可以编写一个存储过程来扫描字符串并返回该数字,然后在查询中使用它。

但是,我认为您应该重新考虑插入成分的设计,以便在执行此查询时避免在每行中搜索字符串。添加'num_linebreaks'列,计算换行符数,并在添加Indgredients时设置此列。

如果您无法控制正在执行插入的应用,那么您可以使用存储过程根据触发器更新num_linebreaks。

答案 3 :(得分:0)

谢谢,php代码如下:

$check = explode("\r\n", $_POST['ingredients']); 
$lines = count($check);

那么我怎样才能更新表格中的所有信息,以便根据一位研究员的字段成分将Ingred_count用于以前的记录?