为mySQL数据库实现定期匹配系统的正确方法是什么?

时间:2013-03-22 17:21:13

标签: mysql sql perl scheduled-tasks matching

请原谅我是否经常询问这个问题,但我在描述我的问题时遇到了麻烦,因此无法找到与Google有用的内容。

我想创建一个“配置文件匹配系统”,用户可以使用两个列表。一个列表是他们需要的事物列表,另一个列表是他们想要的事物列表。我希望我的网站能够根据互补需求来匹配人们,但我不确定最好的方法是什么。我在Perl中构建了站点,我使用MySQL作为我的数据库。我的第一个想法是,我需要一个预定的Perl脚本来查询数据库,然后将匹配输入数据库,以便在下次用户时提供给用户,但我想不出另一种方法,所以我我想我会看到互联网说的话。

感谢帮助人员&加尔斯, 迪伦

1 个答案:

答案 0 :(得分:1)

您应该能够使用SQL Join获得所需内容。示例SQLite代码:

.headers on
.separator "\t"
create temporary table 'buyers' (
    buyer integer primary key,
    wants char(1)
);

insert into buyers(wants) values('a');
insert into buyers(wants) values('b');
insert into buyers(wants) values('c');
insert into buyers(wants) values('d');
insert into buyers(wants) values('e');

create temporary table 'sellers' (
    seller integer primary key,
    offers char(1)
);

insert into sellers(offers) values ('a');
insert into sellers(offers) values ('b');
insert into sellers(offers) values ('b');
insert into sellers(offers) values ('e');

select
    buyers.buyer as buyer,
    sellers.seller as seller,
    buyers.wants as good
from
    buyers left outer join sellers
on
    buyers.wants = sellers.offers
;

输出:

buyer   seller  good
1       1       a
2       2       b
2       3       b
3               c
4               d
5       4       e

在Perl中做类似的事情:

#!/usr/bin/env perl

use strict;
use warnings;

use Graph::Undirected;

my $g = Graph::Undirected->new(unionfind => 1);

# buyers
$g->add_edge(b1 => 'a');
$g->add_edge(b2 => 'b');
$g->add_edge(b3 => 'c');
$g->add_edge(b4 => 'd');
$g->add_edge(b5 => 'e');

# sellers

$g->add_edge(s1 => 'a');
$g->add_edge(s2 => 'b');
$g->add_edge(s3 => 'b');
$g->add_edge(s4 => 'e');

use YAML;
print Dump [ $g->connected_components ];

输出:

-
  - a
  - b1
  - s1
-
  - s2
  - b
  - s3
  - b2
-
  - b4
  - d
-
  - e
  - b5
  - s4
-
  - b3
  - c