python - 连接两个不同的 mySQL 表的最佳方式——从 python 规划 django

标签 python mysql django django-models

table a (t_a):
id  name    last    first   email           state   country
0   sklass  klass   steve   sklass@foo.com  in      uk
1   jabid   abid    john    abid@foo.com    ny      us
2   jcolle  colle   john    jcolle@foo.com  wi      us


table b (t_b):
id  sn      given   nick    email           l   c   
0   steven  klass   steve   sklass@foo.com  in  uk
1   john    abid    -       abid_j@foo.com  ny  us
2   johnny  colle   john    jcolle@foo.com  wi  us
3   john    abid    -       abid@foo.com    ny  us

上面列出的是一个(缩写的)列和行 mySQL 表。查看这两个表会变得非常清楚,通过严格查看值(不查看 id)并比较匹配的值数量,您将获得这些值匹配。

t_a     t_b
0       0
1       3
2       2
-       1

我最终想做的是在 Django 中执行此操作——我不确定这是否重要。过去我使用纯 python 完成此操作,我在其中销毁旧数据并仅创建三个新表。我想摆脱我的实现(如下所列),因为我看到的问题是时间会改变事物,人们来来去去。过去我只是重新生成数据——但现在我想跟踪人们何时离开,而不是简单地替换(删除)数据。我相信通过执行 SQL 更新更优雅并保留历史记录。

我想知道如何直接从按以下方式合并数据的 mySQL(SQL 函数或新表的构造)中获取此合并答案。我想使用纯 SQL 来做到这一点(我相信我可以在 Django 中做到这一点)。所以我正在寻找满足以下条件的解决方案:

  1. 有一个 min_match,它定义了两行之间必须对齐才能被视为有效的最小匹配数。
  2. 虽然表格可能有不同的长度,但它是一对一的映射。换句话说,多对一可能不会发生(还)

现在我的背景是 python,对我来说,最简单的方法是对两个表中较短的一个进行 for 循环,然后对另一个表进行 for 循环,查看匹配项的数量。在代码中,这看起来像这样。

t_a = [ ["sklass", "klass", "steve", "sklass@foo.com", "in", "uk", ],
        ["jabid", "abid", "john", "abid@foo.com", "ny", "us", ],
        ["jcolle", "colle", "john", "jcolle@foo.com", "wi", "us", ], ]

t_b = [ ["steven", "klass", "steve", "sklass@foo.com", "in", "uk",],
        ["john", "abid", "abid_j@foo.com", "ny", "us",],
        ["johnny", "colle", "john", "jcolle@foo.com", "wi", "us",],
        ["john", "abid", "abid@foo.com", "ny", "us",], ]

min_match = 3

for person_a in t_a:
    match = 0
    match_pct = 0.0
    match_a_index = t_a.index(person_a)
    for person_b in t_b:
        new_match_count = len(list(set(person_a) & set(person_b)))
        if new_match_count > match:
            match = new_match_count
            match_b_index = t_b.index(person_b)
            match_pct = "%.2f" % (float(new_match_count) / \
              float(len(set(person_a + person_b))) * 100)
    if match >= min_match:
        print match_a_index, match_b_index #, match_pct, match

评论回避了一个问题,你为什么不直接加入电子邮件地址。我不一定知道列中的值会匹配。我确定 t_a 中给定行的值将与 t_b 中行的值相匹配。我想要 t_a 到 t_b 中给定行的最高(最可能)匹配,并且仅当匹配数高于 min_match 时。

最佳答案

您可以在 MySQL 中直接通过通过存储过程执行的游标来执行此操作。

DELIMITER $$
CREATE PROCEDURE `proc_name`()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a_id BIGINT UNSIGNED;
  DECLARE b_id BIGINT UNSIGNED;
  DECLARE x_count INT;

  -- something like the following
  DECLARE cur1 CURSOR FOR SELECT t_a.id, t_b.id FROM t_a, t_b WHERE t_a.email = t_b.email;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  SELECT COUNT(*) INTO x_count FROM t_a, t_b WHERE t_a.email = t_b.email;

  IF(x_count > <some_min_value>) THEN

    OPEN cur1;

    REPEAT
      FETCH cur1 INTO a_id, b_id;
      IF NOT done THEN

        -- do something here like update rows, remove rows, etc.
        -- a_id and b_id hold the two id values for the two tables which
        -- I assume to be primary keys

      END IF;
    UNTIL done END REPEAT;

    CLOSE cur1;

  END IF;
END
$$

关于python - 连接两个不同的 mySQL 表的最佳方式——从 python 规划 django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1826686/

相关文章:

python - 报告用户 Django 错误报告

python - 如何根据 Django 中的两个字段对查询集进行排序?

django - 如何处理DRF中的空索引列表?

python - namedtuple 需要 3 个参数?

python - logger.setLevel(logging.INFO) 不会使 logger.info() 可见

mysql - Codeigniter - 如何从数据库中获取一个字段值大于另一个字段值的记录?

javascript - 使用 Javascript 计算列表项的长度

django - 在 Geodjango + Postgres 中存储一个圆圈

Mysql子查询计算(错误1054)

mysql - INSTR() 和 GROUP_CONCAT() 在服务器之间返回不同的结果