顺序的差距,加入相对位置

时间:2016-02-17 04:15:39

标签: mysql sql join

我第一次提问。如果您必须点击图片以获取样本数据以及我正在寻找的内容,请提前道歉。我无法通过文本获得正确的格式。

Image with sample data and what I'm looking for

编辑:也许这会有所帮助......

我的数据实际上只是由' |'分隔的字符串。和','。每个订单有2个方面和一堆提供商和价格。供应商按价格下降。

order1 |侧= 0 | 0,价格1,provider1 | 1,price2,Provider2之间| 2,price3,provider1 order1 |侧= 1 | 0,price4,Provider2之间| 1,price5,provider1 | 2,price6,provider1

因此,provider1在side0上给出了最优价格(price1),在side0上给出了最差价格(price3)。 Provider1在side1上也给出了第二好的价格,在side1上给出了最差的价格。我想将price1与price5和price3与price6配对并获得差异。

首先,我将字符串解析为包含列的2个表:

表1

订单|侧面|等级|供应商|价格

1 ...... | 0 ..... | 0 ....... | 1 ........... | 1 ....... < / p>

1 ...... | 0 ..... | 1 ....... | 2 ........... | 2 ....... < / p>

1 ...... | 0 ..... | 2 ....... | 1 ........... | 3 ....... < / p>

表2

订单|侧面|等级|供应商|价格

1 ...... | 1 ..... | 0 ....... | 2 ........... | 4 ....... < / p>

1 ...... | 1 ..... | 1 ....... | 1 ........... | 5 ....... < / p>

1 ...... | 1 ..... | 2 ....... | 1 ........... | 6 ....... < / p>

我想比较提供者1在side0上的第一个价格与提供者1在第一方的第一个价格,无论其水平如何。而且提供者1在side0上的第二个价格与提供者1在第一方的第二个价格无论等级如何。等等,只要我能将双方的提供商1的价格配对。

我的图片是从table1中选择订单,级别,价格,其中provider = 1; 并从table2中选择order,level,price,其中provider = 1;

在生产中,我将有超过1个订单,而0和1的价格数量不均匀。因此,如果provider1在side0上给出1个价格,在side1上给出3个,我只想比较side0价格和最好的side1价格。

编辑2:找到解决方案

显然我想要的是http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html中描述的按组自动增量。

创建table3 (order int(10)unisgned,id MEDIUMINT NOT NULL AUTO_INCREMENT,price double,primary key(order,id) )ENGINE = MyISAM;

插入table3(订单,价格)为(选择订单,来自table1的价格,其中provider = 1);

重复其他表,加入订单,id。

1 个答案:

答案 0 :(得分:0)

很难理解这个场景。根据您的样本数据,这里有解决方案。

SQL:

-- Prepare data, just for demo
create table table1(id int auto_increment primary key, `order` int, var int, data char(20));
create table table2(id int auto_increment primary key, `order` int, var2 int, data2 char(20));
insert into table1(`order`, var, data) values
(1,1,'x'),
(1,3,'y'),
(1,5,'z');
insert into table2(`order`, var2, data2) values
(1,1,'a'),
(1,2,'b'),
(1,6,'c'),
(1,7,'d');
select * from table1;
select * from table2;

-- Process of reporting
SET @rownum1:=0; 
SET @rownum2:=0; 
SELECT t1.order, t1.var, t2.var2, t1.data, t2.data2
FROM 
    (SELECT *, @rownum1:=@rownum1+1 AS rownum FROM table1) t1, 
    (SELECT *, @rownum2:=@rownum2+1 AS rownum FROM table2) t2
WHERE t1.rownum = t2.rownum AND 
    t1.`order` = 1 AND
    t2.`order` = 1;

输出:

mysql> select * from table1;
+----+-------+------+------+
| id | order | var  | data |
+----+-------+------+------+
|  1 |     1 |    1 | x    |
|  2 |     1 |    3 | y    |
|  3 |     1 |    5 | z    |
+----+-------+------+------+
3 rows in set (0.00 sec)

mysql> select * from table2;
+----+-------+------+-------+
| id | order | var2 | data2 |
+----+-------+------+-------+
|  1 |     1 |    1 | a     |
|  2 |     1 |    2 | b     |
|  3 |     1 |    6 | c     |
|  4 |     1 |    7 | d     |
+----+-------+------+-------+
4 rows in set (0.00 sec)

mysql>
mysql> -- Process of reporting
mysql> SET @rownum1:=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @rownum2:=0;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT t1.order, t1.var, t2.var2, t1.data, t2.data2
    -> FROM
    -> (SELECT *, @rownum1:=@rownum1+1 AS rownum FROM table1) t1,
    -> (SELECT *, @rownum2:=@rownum2+1 AS rownum FROM table2) t2
    -> WHERE t1.rownum = t2.rownum AND
    -> t1.`order` = 1 AND
    -> t2.`order` = 1;
+-------+------+------+------+-------+
| order | var  | var2 | data | data2 |
+-------+------+------+------+-------+
|     1 |    1 |    1 | x    | a     |
|     1 |    3 |    2 | y    | b     |
|     1 |    5 |    6 | z    | c     |
+-------+------+------+------+-------+
3 rows in set (0.00 sec)