Php 如何对连接表中的数据进行计数和排序
我有多对多关系的表: 参数Php 如何对连接表中的数据进行计数和排序,php,mysql,sql,Php,Mysql,Sql,我有多对多关系的表: 参数 +-------------------+-----------------------+ | Field | Type | +-------------------+-----------------------+ | id | int(11) | | name | varchar(20) | 产品 +-
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id | int(11) |
| name | varchar(20) |
产品
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id | int(11) |
| name | varchar(20) |
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id_parameters | int(11)FK |
| id_product | int(11)FK |
+---------+----------+
|id_param |id_product|
+--------------------+
| 1 | 1 |
| 2 | 1 | ----> Product#1
| 3 | 1 |
| 4 | 1 |
----------------------
| 1 | 2 |
| 2 | 2 |
| 6 | 2 | ----> Product#2
| 4 | 2 |
| 9 | 2 |
----------------------
| 5 | 3 |
| 7 | 3 | ----> Product#3
| 1 | 3 |
产品参数
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id | int(11) |
| name | varchar(20) |
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id_parameters | int(11)FK |
| id_product | int(11)FK |
+---------+----------+
|id_param |id_product|
+--------------------+
| 1 | 1 |
| 2 | 1 | ----> Product#1
| 3 | 1 |
| 4 | 1 |
----------------------
| 1 | 2 |
| 2 | 2 |
| 6 | 2 | ----> Product#2
| 4 | 2 |
| 9 | 2 |
----------------------
| 5 | 3 |
| 7 | 3 | ----> Product#3
| 1 | 3 |
所以,产品可能有一些参数,参数可能与产品有关。
当我选择几个参数时,我需要输出包含选中参数的产品的排序名称,但排序必须基于匹配参数的数量,但不止一个
例如:
产品参数
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id | int(11) |
| name | varchar(20) |
+-------------------+-----------------------+
| Field | Type |
+-------------------+-----------------------+
| id_parameters | int(11)FK |
| id_product | int(11)FK |
+---------+----------+
|id_param |id_product|
+--------------------+
| 1 | 1 |
| 2 | 1 | ----> Product#1
| 3 | 1 |
| 4 | 1 |
----------------------
| 1 | 2 |
| 2 | 2 |
| 6 | 2 | ----> Product#2
| 4 | 2 |
| 9 | 2 |
----------------------
| 5 | 3 |
| 7 | 3 | ----> Product#3
| 1 | 3 |
客户端选择Id_参数:1,2,6,9
结果按顺序排列:
Product#2 -> 4 matches
Product#1 -> 2 matches
Product#3 -> 1 matches (doesn't outputted)
我用php编写了糟糕的代码,但我认为它可以更容易地解决
如何在SQL中实现这一点 您必须按id_产品字段分组,使用id_参数值筛选单个结果,然后按id_参数计数排序。像这样:
SELECT name
FROM Parameters_Product
INNER JOIN Parameters ON id_product = id
WHERE id_param IN (1,2,6,9)
GROUP BY id_product
HAVING COUNT(id_param) > 1
ORDER BY COUNT(id_param) desc
如果您只需要id_产品:
select id_product,
count(id_param) as matches
from Parameters_Product
where
id_param in (1,2,6,9)
group by id_product
having count(id_param) >1
order by matches desc;
如果您需要产品名称:
select p.name,count(pp.id_param) as matches
from
Product p
join Parameters_Product pp
on p.id=pp.id_product
where
pp.id_param in (1,2,6,9)
group by p.name
having count(pp.id_param) >1
order by matches desc;
或
我们总是乐于帮助和支持新的编码人员,但您需要首先帮助自己。:-)如果您有问题,请发布您尝试过的内容,并清楚解释哪些内容不起作用,然后提供。读一个好问题。请务必阅读。您必须使用SELECT count()…、JOIN、GROUP BY和ORDER BY的组合。