来自同一列的所有值组合

时间:2016-04-20 18:12:21

标签: php mysql

我在mysql用户和项目中有两个表。

 user
ID | session| item | 
1  | 1      |A     | 
2  | 1      |B     | 
3  | 1      |C     | 

item
id | item| price | Images
1  | A   | 10    | link
2  | B   | 5     | link
3  | C   | 5     | link
4  | D   | 5     | link

这两个表与项目和表格#34;用户"相关联。我已经通过了数据表单,用户可以从中选择一到五个项目。例如,会话为数字1,而不是使用函数会话开始创建字母数字值。

我显示select语句并循环显示项目的图像:

 $select = "select item, price , images";
 $from = " from item as i, customer as t"; 
$where = " where i.item = t.item and t.session = '".$session."'";
$sql = $select . $from . $where;
 $r=$dbh->prepare($sql);
    $r->execute();
 echo "<ul class=\"tab\"><li class=\"col1\"><strong>item<strong>";

 while($row=$r->fetch(PDO::FETCH_ASSOC)) { 
echo "<img src=\".$row['Images']."\">\n";
}
echo "</li></ul";
  

块引用

通过这种方式,我在示例会话1 abc。

中仅显示用户的请求

我喜欢显示项目表项目的所有其他组合,ab ac ad abc等,但我不知道如何设置代码php。

1 个答案:

答案 0 :(得分:1)

可能有其他方法可以做到这一点,但这里有一个在mysql中。 第一个内部选择(T1)只是抓取一个数字列表,从1向上计数到任何数字,如果你有很多项目,其中组合的数量更高,你可以添加到这个查询。 第二个内部选择(T2)只是抓取项目和价格并为每个项目打开一个位置,然后外部选择内部将它们连接到打开num的位,它选择该项目。 GROUP_CONCAT()连接它们,SUM()只返回该组合的total_price。

SELECT DISTINCT
       GROUP_CONCAT(T2.item ORDER BY T2.item SEPARATOR '' ) as items,
       SUM(T2.price) as total_price
FROM
 (SELECT a.num+b.num+c.num+d.num+e.num+f.num+g.num+1 as num
    FROM
    (SELECT 0 as num UNION SELECT 1)a,
    (SELECT 0 as num UNION SELECT 2)b,
    (SELECT 0 as num UNION SELECT 4)c,
    (SELECT 0 as num UNION SELECT 8)d,
    (SELECT 0 as num UNION SELECT 16)e,
    (SELECT 0 as num UNION SELECT 32)f,
    (SELECT 0 as num UNION SELECT 64)g
    ORDER BY num ASC
  )T1
INNER JOIN
   (SELECT item,price,
       @bit := 1 << @shift as bit,
       @shift := @shift + 1 as shift
    FROM item,
       (SELECT @bit := 1,@shift := 0)initial
    ORDER BY id ASC
    )T2
ON T1.num & T2.bit > 0
GROUP BY T1.num
ORDER BY items

sqlfiddle

输出:

items   total_price
A       10
AB      15
ABC     20
ABCD    25
ABD     20
AC      15
ACD     20
AD      15
B        5
BC      10
BCD     15
BD      10
C        5
CD      10
D        5