【问题标题】:SQL - loop query when WHERE condition comes from listSQL - WHERE条件来自列表时的循环查询
【发布时间】:2017-04-20 10:36:28
【问题描述】:

我有一个 mysql 数据库表,其中包含许多书目记录。它的格式有点像这样:

field content |field title |barcode
Black Beauty  |Title       |9781235842
James Joyce   |Author      |9781452585

有几十个可能的字段标题。

每条记录有效地分布在多行上,记录是共享条形码的组合行。

我想看看哪些项目有短记录。

我有一个特定条形码的有效查询:

select barcode, sum(length(field_content)) from central where barcode = 420908032337 ;

我有一个 1.3k 可疑条形码的列表。有没有办法通过循环遍历这个列表来运行 SQL 查询?

我在工作机器上,可以访问 HeidiSQL、git bash [包括 grep 等],但无法安装 php、ruby 等进行脚本编写。

【问题讨论】:

    标签: mysql sql loops mariadb heidisql


    【解决方案1】:

    无需循环,只需使用 IN 运算符并在那里提供所有条形码值,例如

    where barcode in (1.3K list of barcodes)
    

    您可以通过多种方式使用脚本语言或任何一种方式来形成该 inlist ..。否则,创建一个temporary 表。用那些条形码列表填充它并从该临时表中选择

    where barcode in (select distinct barcodes from my_temp_table)
    

    【讨论】:

    • 感谢您对此的帮助。我按照描述进行了尝试,虽然它为我提供了所有行的总字符数,但它不会产生我正在寻找的逐行结果。我试过: ``` selectbarcode, sum(length(field_content)) from central wherebarcode in (selectbarcode from shortlist) ; ``` 结果是 ``` 条码[1] 604724 ````
    • @Jack,那是什么shortlist?以及您是如何将这些价值观纳入其中的?
    • Shortlist 是另一个包含 1.3k 值的表。我用 ```LOAD DATA LOW_PRIORITY LOCAL INFILE 'H:\\shortlist.csv' REPLACE INTO TABLE sierra_import.shortlist FIELDS OPTIONALLY ENCLOSED BY '\n' LINES TERMINATED BY '\r\n 将它们添加到表中' 忽略 1 行 (barcode);````
    【解决方案2】:
    select barcode,
           sum(length(field_content)) AS rec_len
        from central
        GROUP BY barcode
        ORDER BY rec_len  -- display the shortest first
        LIMIT 50;   -- if you want to see just 50
    

    【讨论】:

    • 太棒了。谢谢。它确实创建了一个奇怪的第一行,它似乎连接了一个单元格中的所有条形码,但忽略了它完美地工作。再次感谢。对于将来咨询此问题的任何人-此解决方案告诉我最短的记录是什么。它不会通过查阅嫌疑人名单来做到这一点,但它确实很快,并且无需查阅该名单。
    • 检查central 看看里面是否有'concatenate'。
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2014-03-29
    相关资源
    最近更新 更多