jjzjj

PHP MySQL 只查询一些字母然后返回最短的字符串?

coder 2023-10-11 原文

例如,我的数据库表中有以下数据...

A Bridge Too Far
A Bridge Too Far trilogy
A bridge Too Far the sequel
Goodfellas the return of Pesci
Goodfellas
Goodfellas 2
Goodfellas 3

等等。还会有一些独特的条目以及更多类似上面的条目

我要显示的只有:

A Bridge Too Far
Goodfellas

基本上删除了不需要的原始标题周围的额外信息。

我在想我可能需要检查第一个单词中空格前的字母数量,如果超过了,就说 5 个字母与下一行匹配,如果匹配,则继续以某种方式将这些行添加到列表中然后当它停止匹配时吐出最短的那个?如果第一个单词少于 5 个字母,则移动到第二个单词(只是试图避免::them::this::their 等等)

我试图从 SQL/PHP 的角度对此进行逻辑思考,但我很挣扎,这可能吗?

感谢所有帮助。

达伦

Phil::谢谢 - 你的版本适用于 sqlize 但我的版本不行!

这是我使用的实际代码:

$sql = mysql_query("create temporary table movies (name VARCHAR(255))",$db);        

$sql2 = mysql_query("create temporary table movies2 (name VARCHAR(255))",$db);

$sql3 = mysql_query("insert into movies(name) select title from PRprod_FILMS where genre = 'Action  Adventure'",$db);

$sql4 = mysql_query("insert into movies2(name) select name from movies",$db);

// both tables movies and movies2 identical now

$sql5 = mysql_query("
  SELECT * FROM movies m 
        WHERE NOT EXISTS (
        SELECT 1 FROM movies2 m2
        WHERE m.name LIKE CONCAT(m2.name, '%')
        AND LENGTH(m2.name) < LENGTH(m.name)) order by name
        ",$db);

while ($sql55 = mysql_fetch_array($sql5)){ // aa

echo $sql55[name]."<br />";

    } // close aa

mysql_close();

我仍然得到如下内容:

2 Fast 2 Furious
2 Fast 2 Furious Bluray 2003
2 Fast 2 Furious Box Set DVD
2 Fast 2 Furious DVD
2 Fast 2 Furious HD DVD 2003 US Import

Bad Boys Collectors Edition DVD Wide Screen
Bad Boys DVD
Bad Boys DVD 1983
Bad Boys DVD 1995
Bad Boys DVD Superbit Wide Screen

我只想要:2 Fast 2 Furious && Bad Boys DVD

有什么想法吗?

达伦

再次感谢菲尔,但我仍然得到:

310 To Yuma BluRay
310 To Yuma DVD 2007
310 To Yuma DVD Wide Screen

我想另一种表达我想要的方式是:

如果前 5 个字符(包括空格)匹配,一旦它们停止匹配,就去掉剩下的并打印结果。现在,我也必须再次小心,因为“The Hangover” && “The Hangover 2” 很合理!

可能吗?

达伦

此外,我刚刚查看了一些示例,看看我是否可以弄清楚如何进步并注意到...

如果我简单地打印标题,原始列表的示例显示:

0091 Vol3 DVD
02 in H20 A SelfHelp Course on Breathing in Swimmi... // missing
0430 DVD // missing
1 2 3 4 5 DVD // missing
1 Night In Paris DVD // missing
10 Best Fitness DVD // missing
10 Best Fitness Five Discs DVD // missing
10 DVD 1979 // missing
10 Hollywood Leading Men DVD

查询之后:

0091 Vol3 DVD
10 Hollywood Leading Men DVD

注意 "0091 Vol3 DVD"&& "10 Hollywood Leading Men DVD"之间少了 7 行

最佳答案

试试这个...

SELECT `title` FROM `PRprod_FILMS` m
WHERE `genre` = 'Action  Adventure'
AND NOT EXISTS (
    SELECT 1 FROM `PRprod_FILMS` m2
    WHERE m.`title` LIKE CONCAT(m2.`title`, '%')
    AND LENGTH(m2.`title`) < LENGTH(m.`title`)
    AND m2.`genre` = m.`genre`
)
ORDER BY `title`;

这是一个例子 - http://www.sqlize.com/HIaf4zr69L (使用两个相同的临时表,因为您不能在 MySQL 中多次引用同一个临时表)

更新

使用你的样本集,我得到

A Bridge Too Far
Goodfellas
2 Fast 2 Furious
Bad Boys Collectors Edition DVD Wide Screen
Bad Boys DVD
310 To Yuma BluRay
310 To Yuma DVD 2007
310 To Yuma DVD Wide Screen

明显重复的原因是因为它只是消除了较短字符串的扩展。解释...

您删除了“Bad Boys DVD 1983”和“Bad Boys DVD 1995”,因为它们是“Bad Boys DVD”的扩展。 “Bad Boys Collectors Edition DVD Wide Screen”保留在结果集中,因为它不是任何其他模式的扩展。如果您添加“坏男孩”,您将消除除此之外的所有内容。

关于PHP MySQL 只查询一些字母然后返回最短的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734169/

有关PHP MySQL 只查询一些字母然后返回最短的字符串?的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  6. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  7. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  8. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  9. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  10. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

随机推荐