Mysql 如何根据N得出一个近似的数字并接近现实?
她是我的桌子:Mysql 如何根据N得出一个近似的数字并接近现实?,mysql,sql,Mysql,Sql,她是我的桌子: // users +----+--------+------------+----------------+------------+ | id | name | reputation | avatar | visibility | +----+--------+------------+----------------+------------+ | 1 | John | 344 | er0942334r4... | 1
// users
+----+--------+------------+----------------+------------+
| id | name | reputation | avatar | visibility |
+----+--------+------------+----------------+------------+
| 1 | John | 344 | er0942334r4... | 1 |
| 2 | Peter | 65544 | 340ojfc343f... | 0 |
+----+--------+------------+----------------+------------+
// posts
+----+--------+------------+-----------+
| id | title | content | author_id |
+----+--------+------------+-----------+
| 1 | title1 | content1 | 2 |
| 2 | title2 | content2 | 1 |
+----+--------+------------+-----------+
我的问题是:
SELECT p.*,
COALESCE(u.name,'NoName') as `name`,
u.reputation as `rep`,
COALESCE(u.avatar,'default') as avatar
FROM posts p
LEFT JOIN users u
ON u.id = p.author_id AND u.visibility = 1
这是电流输出:
+----+--------+------------+-----------+--------+------+----------------+
| id | title | content | author_id | name | rep | avatar |
+----+--------+------------+-----------+--------+------+----------------+
| 1 | title1 | content1 | 2 | NoName | | default |
| 2 | title2 | content2 | 1 | John | 344 | er0942334r4... |
+----+--------+------------+-----------+--------+------+----------------+
如您所见,rep
列将为空,其中user.visibility=1
。现在,我想根据users.reputation
的实际值创建一个近似值,并将其设置在那里
下面是预期的结果:
+----+--------+------------+-----------+--------+------+----------------+
| id | title | content | author_id | name | rep | avatar |
+----+--------+------------+-----------+--------+------+----------------+
| 1 | title1 | content1 | 2 | NoName | +5k | default |
| 2 | title2 | content2 | 1 | John | 344 | er0942334r4... |
+----+--------+------------+-----------+--------+------+----------------+
以下是所有可能的情况,如rep
:
1
+100
+1k
+5k
+20k
+100k
我该怎么做呢?您需要稍微重新构造查询,将“可见性”的逻辑移到
选择中
我不确定rep
的确切逻辑是什么,但这里有一个例子:
SELECT p.*,
(CASE WHEN u.visibility = 1 THEN u.name ELSE 'NoName' END) as `name`,
(CASE WHEN u.visibility = 1 THEN CAST(u.reputation as VARCHAR)
WHEN rep < 100 THEN '1'
WHEN rep < 1000 THEN '+100'
. . .
END) as `rep`,
(CASE WHEN u.visibility = 1 THEN u.avatar ELSE 'default' END) as avatar
FROM posts p LEFT JOIN
users u
ON u.id = p.author_id;
选择p.*,
(当u.visibility=1时,则u.name ELSE'NoName'结束)作为'name',
(u.visibility=1时的情况,然后强制转换(u.Famility as VARCHAR)
当rep<100时,则为“1”
当rep<1000时,则“+100”
. . .
(完)作为"rep",,
(当u.visibility=1时,则u.avatar ELSE‘默认’结束)作为化身
从立柱p向左连接
用户u
ON u.id=p.author\u id;
这假设rep
作为数字存储在表中。但是,您输出的值必须是字符串。您的解决方案工作得非常好。。。但对我来说有一件模糊的事情:我的查询速度要快得多,为什么?我创建了一个基准,执行了1000次,我的:2.4秒,你的:4.7秒。为什么?@MartinAJ。此版本需要处理users
中的所有行。如果most将可见性标志设置为0
,则会过滤掉大量数据。我有点惊讶性能上的差异会如此之大(相对而言),但这可能会有所不同。