Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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 如何根据N得出一个近似的数字并接近现实?_Mysql_Sql - Fatal编程技术网

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
,则会过滤掉大量数据。我有点惊讶性能上的差异会如此之大(相对而言),但这可能会有所不同。