Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Mysql 按不匹配项的匹配数排序_Mysql_Sql - Fatal编程技术网

Mysql 按不匹配项的匹配数排序

Mysql 按不匹配项的匹配数排序,mysql,sql,Mysql,Sql,我不想使用匹配,因为如果我在一行中有许多关键字,则无法获得我想要进行查询的相关性。目标是通过匹配的数量获得顺序 以下是当前用于测试的MySQL数据库的详细信息: -- -- Base de datos: `libros` -- -- -------------------------------------------------------- -- -- Estructura de tabla para la tabla `libros` -- CREATE TABLE `lib

我不想使用匹配,因为如果我在一行中有许多关键字,则无法获得我想要进行查询的相关性。目标是通过匹配的数量获得顺序

以下是当前用于测试的MySQL数据库的详细信息:

-- 
-- Base de datos: `libros`
-- 

-- --------------------------------------------------------

-- 
-- Estructura de tabla para la tabla `libros`
-- 

CREATE TABLE `libros` (
  `id_unico` int(11) NOT NULL,
  `titulo` text NOT NULL,
  `id_libro` text NOT NULL,
  `tipo` text NOT NULL,
  `posicion` int(11) NOT NULL,
  `precio` float(20,2) NOT NULL,
  `keywords` text NOT NULL,
  `proveedor` text NOT NULL,
  PRIMARY KEY  (`id_unico`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla `libros`
-- 

INSERT INTO `libros` VALUES (1, 'La ladrona de los libros', '9788426419866', 'nuevo', 200, 10.00, 'Ladrona, Libros, Ladron', 'eBay');
INSERT INTO `libros` VALUES (2, 'Los surcos del azar', '9788415685364', 'nuevo', 3, 13.00, 'Surcos, Azar', 'Marcelo');
INSERT INTO `libros` VALUES (3, 'Los surcos del azar', '9788415685364', 'nuevo', 5, 15.00, 'Surcos, Azar', 'Amazon');
INSERT INTO `libros` VALUES (4, 'El castillo', '9788467520170', 'nuevo', 10, 20.00, 'Castillo, Medieval', 'Marcelo');
INSERT INTO `libros` VALUES (5, 'El Castillo', '9788467520170', 'nuevo', 5, 15.00, 'Castillo, Medieval', 'Casa del libro');
INSERT INTO `libros` VALUES (6, 'La jungla de los listos', '9788467040470', 'nuevo', 6, 30.00, 'Jungla, Libros', 'eBay');
INSERT INTO `libros` VALUES (7, 'La jungla de los libros', '9788467040470', 'nuevo', 4, 19.00, 'Jungla, Libros', 'Amazon');
INSERT INTO `libros` VALUES (8, 'La ladrona de los libros', '9788426419866', 'nuevo', 99, 40.00, 'Ladrona, Libros, Ladron, 2014', 'Luis');
INSERT INTO `libros` VALUES (9, 'La ladrona de los libros', '9788426419866', 'nuevo', 21, 22.00, 'Ladrona, Libros, Ladron', 'Lili');
我运行的查询是:

SELECT *, SUM(
IF(keywords LIKE '%Ladrona%', 1, 0) +
IF(keywords LIKE '%Libros%', 1, 0) +
IF(keywords LIKE '%2014%', 1, 0)
) total FROM libros
 WHERE tipo = 'nuevo' GROUP BY id_libro HAVING total > 0 ORDER BY total DESC, posicion ASC, precio DESC

我想返回第一个结果的id_unico“8”,但无法返回。而是分别返回id_unico 1和6。我该怎么办?

在SELECT*语句中不能使用GROUP BY。不是由聚合函数计算的所有列(总和、最大值等)都必须位于GROUP by中

所以也许你想要的是:

SELECT id_libro, SUM(
    IF(keywords LIKE '%Ladrona%', 1, 0) +
    IF(keywords LIKE '%Libros%', 1, 0) +
    IF(keywords LIKE '%2014%', 1, 0)
  ) total
  FROM libros
  WHERE tipo = 'nuevo'
  GROUP BY id_libro
  HAVING total>0
  ORDER BY total DESC
只有绝对确定具有相同id_libro的所有记录也具有相同的位置和精度,才能执行以下操作:

SELECT id_libro, posicion, precio, SUM(
    IF(keywords LIKE '%Ladrona%', 1, 0) +
    IF(keywords LIKE '%Libros%', 1, 0) +
    IF(keywords LIKE '%2014%', 1, 0)
  ) total
  FROM libros
  WHERE tipo = 'nuevo'
  GROUP BY id_libro, posicion, precio
  HAVING total>0
  ORDER BY total DESC, posicion ASC, precio DESC
。。。但这也意味着数据库的设计非常糟糕:(

试试这个:

   SELECT *, (
 IF(keywords LIKE '%Ladrona%', 1, 0) +
 IF(keywords LIKE '%Libros%', 1, 0) +
 IF(keywords LIKE '%2014%', 1, 0)
  ) total FROM libros
 WHERE tipo = 'nuevo'  HAVING total > 0 
 ORDER BY total DESC, posicion ASC, precio DESC

问题是您正在按
id\u libro
分组,但每个
id\u libro
值都有多个
id\u unico
值,因此查询只返回第一个值(1)。要获得每个
id\u libro
分组的值的串联列表,您可以使用
group\u concat

SELECT
    group_concat(id_unico) id_unico,
    titulo,
    id_libro,
    tipo,
    group_concat(posicion) posicion,
    group_concat(precio) precio,
    group_concat(keywords) keywords,
    group_concat(proveedor) proveedor,
    SUM(
       IF(keywords LIKE '%Ladrona%', 1, 0) +
       IF(keywords LIKE '%Libros%', 1, 0) +
       IF(keywords LIKE '%2014%', 1, 0)
       ) total
FROM libros
WHERE tipo = 'nuevo'
GROUP BY id_libro
HAVING total > 0
ORDER BY total DESC, posicion ASC, precio DESC

为什么要获取id 8?问题是您正在按
id\u libro
进行分组,但是每个
id\u libro
值都有多个
id\u unico
值,因此查询只返回第一个值(1)。如果每个
id\u libro
值都有多个列值,您希望得到什么结果?“不是由聚合函数(SUM、MAX等)计算的所有列都必须在groupby中。”实际上,在mysql中,这不是真的。。。