我在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。
答案 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
输出:
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