【问题标题】:Cron Bash - select data from two MySQL tables & export to CSVCron Bash - 从两个 MySQL 表中选择数据并导出到 CSV
【发布时间】:2013-09-18 16:51:50
【问题描述】:

我真的不擅长创建 MySQL 查询,需要一些帮助。我需要创建一个由 cron 作业每周触发一次的 bash 文件——它查询两个表,获取两个表中用户 ID 匹配的数据,并将选择数据添加到 CSV 导出文件中。我希望 CSV 用逗号分隔。现在最好的办法是把它分开。

让这个查询运行的问题是我的语法(我知道这是错误的,因为我只是从网上的各种文章中窃取了 sn-ps)。我确实让每个数据库查询单独工作(从一个表中获取一个查询,另一个表与另一个查询)。现在我需要将它们组合起来以仅获取我需要的数据。

这是我当前的(非工作)查询:

#!/bin/bash
mysql -u USERNAME --password=PASSWORD --database=xxxx_DBNAME --execute='SELECT `xxxx_videotraining_user.user_id`, `xxxx_videotraining_user.training_title`, `xxxx_videotraining_user.status`, `xxxx_users.id`, `xxxx_users.name`, `xxxx_users.user_employer`, `xxxx_users.user_ss_number` WHERE `xxxx_videotraining_user.user_id` = `xxxx_users.id` AND `xxxx_videotraining_user.status` = "Completed" AND `xxxx_users.user_ss_number` > "1" ORDER BY `xxxx_videotraining_user.user_id` LIMIT 0, 10000 AND ' -C > /home/xxxx/subs/vtc/DB_EXPORTS/xxxx_videotraining_completed.csv

我想您可以在这里看到我想要完成的工作 - 任何帮助都将不胜感激!

【问题讨论】:

  • 为什么你认为这是cron特有的?您的问题只是制定查询,您从 cron 运行它的事实是偶然的。
  • 很遗憾,没有用于创建 CSV 文件的 CLI 选项。您可以使用SELECT 语句中的INTO OUTFILE 子句来做到这一点,但是MySQL 服务器需要对该文件具有写权限。

标签: mysql bash cron export-to-csv


【解决方案1】:

您似乎还缺少 FROM 子句,有一个尾随 AND 子句(如其他答案中所述),并且引用不正确。这看起来是您的原始查询:

SELECT `xxxx_videotraining_user.user_id`, 
       `xxxx_videotraining_user.training_title`, 
       `xxxx_videotraining_user.status`, 
       `xxxx_users.id`, 
       `xxxx_users.name`, 
       `xxxx_users.user_employer`, 
       `xxxx_users.user_ss_number` 
 WHERE `xxxx_videotraining_user.user_id` = `xxxx_users.id` AND 
       `xxxx_videotraining_user.status` = "Completed" AND 
       `xxxx_users.user_ss_number` > "1" 
ORDER BY `xxxx_videotraining_user.user_id` 
LIMIT 0, 10000 AND 

我认为您想添加 FROM 子句,分别引用表和字段,并删除尾随 AND,以获得类似:

    SELECT `xxxx_videotraining_user`.`user_id`, 
       `xxxx_videotraining_user`.`training_title`, 
       `xxxx_videotraining_user`.`status`, 
       `xxxx_users`.`id`, 
       `xxxx_users`.`name`, 
       `xxxx_users`.`user_employer`, 
       `xxxx_users`.`user_ss_number` 
  FROM `xxxx_users`,
       `xxxx_videotraining_user`
 WHERE `xxxx_videotraining_user`.`user_id` = `xxxx_users`.`id` AND 
       `xxxx_videotraining_user`.`status` = "Completed" AND 
       `xxxx_users`.`user_ss_number` > "1" 
ORDER BY `xxxx_videotraining_user`.`user_id` 
LIMIT 0, 10000

还可以做一些其他事情来缩短查询的大小并使其更简洁,但这应该可以使其正常运行。

我知道在处理长查询时可以帮助我的一件事是像这样格式化它们,将主要子句分开,这样您就可以看到查询的不同部分。

如果有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    我认为 AND 不应该在这里:

    LIMIT 0, 10000 AND
    

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 2013-02-13
      • 2019-06-22
      • 2019-12-14
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多