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

Php 计算字段中的换行符并按顺序排序,php,mysql,Php,Mysql,我在一个表recipes中有一个字段,它是使用mysql\u real\u escape\u string插入的,我想计算该字段中的换行数,并使用这个数字对记录进行排序 p、 这个领域被称为配料 谢谢大家这样就可以了: SELECT *, LENGTH(Ingredients) - LENGTH(REPLACE(Ingredients, '\n', '')) as Count FROM Recipes ORDER BY Count DESC 然而,我获得换行次数的方式有点不对劲,我认为没有更好

我在一个表
recipes
中有一个字段,它是使用
mysql\u real\u escape\u string
插入的,我想计算该字段中的换行数,并使用这个数字对记录进行排序

p、 这个领域被称为配料

谢谢大家

这样就可以了:

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)并在手之前填写此列。或者,如果您对这类事情感兴趣,请尝试一下。

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

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


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

明白了,谢谢,php代码如下所示:

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

那么,我怎样才能更新表中的所有信息,以便在一次对以往记录的突击调查中根据字段成分进行计数呢?

我在这里假设了很多,但从我在你的帖子中读到的内容来看,你可以稍微改变一下数据库结构,这两种方法都可以解决这个问题,并将数据集开放给更有趣的用途

如果您将配料分离到它自己的表中,并使用链接表来索引哪些配料出现在哪些配方中,那么数据处理将更容易创新。计算每个配方的成分、查找配方中的相似性、搜索包含多组成分的配方等变得更加容易。此外,您的数据也将更加规范化和更小。(存储所有成分的一个全局列表,而不是为每个配方存储一组)

如果您现在使用单个文本输入字段来输入配方的成分,您可以执行一些操作,如将输入内容按行分解,并在保存到数据库时将每行作为成分使用。您可以使用PHP内置的
levenshtein()
similor_text()
函数来处理拼写错误的成分名称,并尽可能使数据规范化,而无需手动整理[用户]数据条目


这只是一个建议,随你的便。

恐怕这不符合要求-你只是根据字符串的长度排序,而不是按换行数排序。你真的在看查询在做什么吗?:)Count将是字符串长度与不带换行符的字符串长度之间的差值。因此,如果我有长度为7的字符串“abc\ndef”,我从abcdef中减去它(这是REPLACE('abc\ndef','\n','')将给我的结果),字符串的长度为6,因此差值为1,这是字符串中的换行数。。。这是有效的,并且经过测试。谢谢你的款待!如何从结果行中的字段中回显结果计数?该行名为“COUNT”,因此无论数据集获取名为“COUNT”的行的方式是:)如果您使用mysql_*函数,可能$row['COUNT']。太棒了,如果您想查看到目前为止的结果,这是一个内存侵入式查询吗?是的。想想它将如何执行。您正在扫描每一行中的一个字符串,可能是每次查询表时(我不知道MySQL如何或是否优化字符串函数的结果)。像这样的php函数会是什么样子?我知道所有的触发点在哪里,但我不能回答;PHP让我头疼:)我被难住了吗?!说真的,这个地方是一个难以置信的帮助,我祝愿这个网站在世界上一切顺利如果你有对同一个数据库的写访问权,你可以创建一个临时表来存储存储过程或PHP代码本身中每个记录和循环的换行次数。该表将只包含记录标识符的一列,您要循环到该表的内容中并扫描所有有问题的内容,\n每次点击时,您要插入一个以上的条目,然后您要编写一个查询,如select count(1),record_id from temp_table group by record_id;我想是的,我确实理解这一点,我已经努力解决了一段时间,问题是他们可以进入的成分种类繁多,不仅仅是西红柿,还有晒红的西红柿等等,还有数量。也许在不久的将来,这个过程需要规范化和简化,但就目前而言,它是可行的。我希望在数据输入方面仍然是一个非常开放和自然的过程,不希望人们像其他网站一样感到受到限制,我想我可以用足够的phpIts来处理数据,实际上这是我最难以处理的数量方面哦,现在我明白你所说的数量是什么意思了。有几种方法可以实现这一点,我不是数据库管理员,但在我看来,您可以在链接表中设置一个quantity列。第1列是配料id,第2列是配方id,第3列是数量。