Mysql 这样可以一句sql出来吗

anydy2008 2013-01-25 02:35:57
-- phpMyAdmin SQL Dump
-- version 2.10.2
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2013 年 01 月 25 日 06:32
-- 服务器版本: 5.0.45
-- PHP 版本: 5.2.3

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- 数据库: `test`
--

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

--
-- 表的结构 `location`
--

CREATE TABLE `location` (
`location_id` int(10) unsigned NOT NULL,
`score` int(10) unsigned NOT NULL,
`welcome` tinyint(3) unsigned NOT NULL,
PRIMARY KEY (`location_id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

--
-- 导出表中的数据 `location`
--

INSERT INTO `location` VALUES (1000, 50, 1);
INSERT INTO `location` VALUES (1001, 60, 0);
INSERT INTO `location` VALUES (1002, 30, 1);
INSERT INTO `location` VALUES (1003, 20, 0);



排序要求:
如果 welcome 为1 则按score + 50 来排
例查询两条数据 按 score DESC
结果为
location_id为1000和1002的两条数据

求助 感谢 !
...全文
160 14 点赞 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
anydy2008 2013-01-25
谢谢版主 phpmyadmin执行过 1w条数据 0.003秒 速度还可以。
  • 打赏
  • 举报
回复
xuzuning 2013-01-25
引用 3 楼 anydy2008 的回复:
引用 2 楼 xuzuning 的回复:表述的不清楚! 是不是要把 welcome 为1 的排在前面? select * from location order by welcome=1 desc, score DESC 版主 是这样的 我想将 welcome=1的 score + 50,再按score倒序来排。前提是不改变原表的值。
这样写 select location_id, if(welcome=1,score+50,score) as score, welcome from location order by score DESC Array ( [0] => Array ( [location_id] => 1000 [score] => 100 [welcome] => 1 ) [1] => Array ( [location_id] => 1002 [score] => 80 [welcome] => 1 ) [2] => Array ( [location_id] => 1001 [score] => 60 [welcome] => 0 ) [3] => Array ( [location_id] => 1003 [score] => 20 [welcome] => 0 ) ) 取几条,自己决定
  • 打赏
  • 举报
回复
deathoctopus 2013-01-25
1万应该问题不大。。 分表看你的增长量了,这样要考虑到因素比较多,只能结合你的需求来做了
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
deathoctopus 1w这样 还会继续增长;如果不行。唯有用张表专门记 +50 后的记录了。
  • 打赏
  • 举报
回复
deathoctopus 2013-01-25
你的数据量有多大?看看show processlist;这条语句是不是在执行中,嵌套比较慢
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
引用 7 楼 deathoctopus 的回复:
SQL code SELECT A.location, A.score, A.welcome FROM(SELECT location, ( CASE WHEN welcome = '1' THEN score + 50 ELSE score end ) AS score, welcome FROM location) AORDER BY A.score 试试……
deathoctopus 谢谢回答 查询的location可能写错了,我改成location_id可以执行得了;不过没反应。用的是phpmyadmin,怪了;第一次遇到执行没反应的。
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
引用 6 楼 jordan102 的回复:
SELECT location_id ,score+50 , welcome FROM location WHERE welcome=1 ORDER BY score DESC
jordan102 谢谢回答。可我不是要只查 welcome = 1;而是welcome = 1的score 要加上50。 想要实现的是 welcome=1 的记录权重会高一点。
  • 打赏
  • 举报
回复
deathoctopus 2013-01-25
SELECT A.location, A.score, A.welcome
FROM
(SELECT location, ( CASE WHEN welcome = '1' THEN score + 50 ELSE score end ) AS score, welcome
FROM location) A
ORDER BY A.score  
试试这样?我没测试哈 大概意思就是用一个select嵌套,第一次先把表的结果和外加分数算出来,再对这个结果查询第二次
  • 打赏
  • 举报
回复
一起混吧 2013-01-25
SELECT location_id ,score+50 , welcome FROM location WHERE welcome=1 ORDER BY score DESC
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
相当于 将welcome为1的记录的score列加上50,然后再按score 来倒序。希望是一句sql查询出来,不影响原表的值。
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
加50后为以下数据 location_id score welcome 1000 100 1 1001 60 0 1002 80 1 1003 20 0 按 score 倒序取前两条数据: location_id score welcome 1000 100 1 1002 80 1
  • 打赏
  • 举报
回复
anydy2008 2013-01-25
引用 2 楼 xuzuning 的回复:
表述的不清楚! 是不是要把 welcome 为1 的排在前面? select * from location order by welcome=1 desc, score DESC
版主 是这样的 我想将 welcome=1的 score + 50,再按score倒序来排。前提是不改变原表的值。
  • 打赏
  • 举报
回复
xuzuning 2013-01-25
表述的不清楚! 是不是要把 welcome 为1 的排在前面? select * from location order by welcome=1 desc, score DESC
  • 打赏
  • 举报
回复
一起混吧 2013-01-25
welcome 为0的不要?
  • 打赏
  • 举报
回复
相关推荐
发帖
基础编程
加入

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2013-01-25 02:35
社区公告
暂无公告