Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何对连接表中的数据进行计数和排序_Php_Mysql_Sql - Fatal编程技术网

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的组合。