【问题标题】:SQL Query returning duplicate valuesSQL 查询返回重复值
【发布时间】:2015-01-16 17:26:30
【问题描述】:

我正在为一个在线游戏网站开发一个排名系统,但在查询返回重复值时遇到了问题。

查询:

SELECT * FROM `personajes`,`ranking_pvp` ORDER BY `victorias` DESC LIMIT 30

结果: http://i.imgur.com/rXnZP7B.jpg

重复值​:

`nombre` , `victorias` , `derrotas`

“personajes”表:

  • id INT(11) 非空
  • nombre VARCHAR(30) NOT NULL
  • sexo TINYINT(2) NOT NULL
  • clase SMALLINT(3) NOT NULL
  • color1 INT(11) 非空
  • color2 INT(11) 非空
  • color3 INT(11) 非空
  • kamas BIGINT(32) NOT NULL
  • puntosHechizo INT(11) 非空
  • capital INT(11) 非空
  • energia INT(11) NOT NULL DEFAULT '10000'
  • nivel INT(11) 非空
  • xp BIGINT(32) NOT NULL DEFAULT '0'
  • talla INT(11) 非空
  • gfx INT(11) 非空,
  • alineacion INT(11) NOT NULL DEFAULT '0',
  • honor INT(11) NOT NULL DEFAULT '0',
  • deshonor INT(11) NOT NULL DEFAULT '0',
  • nivelAlin INT(11) NOT NULL DEFAULT '0' COMMENT 'Nivel alineamiento',
  • cuenta INT(11) 非空,
  • vitalidad INT(11) NOT NULL DEFAULT '0',
  • fuerza INT(11) NOT NULL DEFAULT '0',
  • sabiduria INT(11) NOT NULL DEFAULT '0',
  • inteligencia INT(11) NOT NULL DEFAULT '0',
  • suerte INT(11) NOT NULL DEFAULT '0',
  • agilidad INT(11) NOT NULL DEFAULT '0',
  • mostrarAmigos TINYINT(4) NOT NULL DEFAULT '1',
  • mostrarAlineacion INT(11) NOT NULL DEFAULT '0',
  • canal VARCHAR(15) NOT NULL DEFAULT '*#%!pi$:?',
  • mapa INT(11) NOT NULL DEFAULT '8479',
  • celda INT(11) 非空,
  • porcVida INT(11) NOT NULL DEFAULT '100',
  • hechizos TEXT NOT NULL,
  • objetos TEXT NOT NULL,
  • posSalvada VARCHAR(20) NOT NULL DEFAULT '8570,314',
  • zaaps VARCHAR(250) NOT NULL DEFAULT '',
  • oficios VARCHAR(300) NOT NULL DEFAULT '',
  • xpMontura TINYINT(2) NOT NULL DEFAULT '0',
  • montura INT(11) NOT NULL DEFAULT '-1',
  • titulo VARCHAR(255) NOT NULL DEFAULT '0',
  • esposo INT(11) NOT NULL DEFAULT '0',
  • tienda TEXT NOT NULL,
  • mercante INT(11) NOT NULL DEFAULT '0',
  • sFuerza INT(11) NOT NULL DEFAULT '0',
  • sInteligencia INT(11) NOT NULL DEFAULT '0',
  • sAgilidad INT(11) NOT NULL DEFAULT '0',
  • sSuerte INT(11) NOT NULL DEFAULT '0',
  • sVitalidad INT(11) NOT NULL DEFAULT '0',
  • sSabiduria INT(11) NOT NULL DEFAULT '0',
  • restriccionesA INT(11) NOT NULL DEFAULT '8192',
  • restriccionesB INT(11) NOT NULL DEFAULT '0',
  • encarnacion INT(11) NOT NULL DEFAULT '-1',
  • emotes INT(11) NOT NULL DEFAULT '0',
  • ornamento TINYINT(2) NOT NULL DEFAULT '0',
  • ornamentos VARCHAR(255) NOT NULL,
  • misiones TEXT NOT NULL,
  • coleccion TEXT NOT NULL,
  • resets SMALLINT(3) NOT NULL DEFAULT '0',
  • almanax TEXT NOT NULL,
  • ultimoNivel INT(11) NOT NULL DEFAULT '0',
  • setsRapidos TEXT NOT NULL COLLATE 'latin1_spanish_ci'
  • 主键 (id)

“ranking_pvp”表:

  • id INT(11) 非空,
  • nombre VARCHAR(255) NOT NULL,
  • victorias INT(11) NOT NULL,
  • derrotas INT(11) 非空,
  • nivelAlineacion INT(11) 非空,
  • 主键 (id)

有人可以增加我的查询以删除重复值吗?

等待和谢谢 ;)

【问题讨论】:

  • 您从两个不同的表中选择,完全没有join 条件,这意味着您将获得笛卡尔连接,table1 x table2。例如表 1 中有 100 条记录,表 2 中有 50 条记录,您将获得 100x50 = 5000 个结果行。
  • 使用JOIN我的查询如何?
  • 不知道。您需要让这两个表共享至少一个要加入的公共字段,但由于您没有提供有关结构的详细信息,我们无法为您提供帮助:en.wikipedia.org/wiki/Join_%28SQL%29
  • 已更新。等列:personajes.nombreranking_pvp.nombre

标签: mysql web ranking


【解决方案1】:

使用您刚刚添加为评论的信息:

SELECT *
FROM personajes p
JOIN ranking_pvp rp ON rp.nombre = p.nombre
ORDER BY `victorias` DESC
LIMIT 30

【讨论】:

  • 我使用查询解决了我的问题:SELECT * FROM personajes JOIN ranking_pvp ON personajes.nombre = ranking_pvp.nombre ORDER BY victorias DESC LIMIT 30。基本上与您的查询相同。只有您“重命名”了这些表。无论如何,谢谢!
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多