小编Zan*_*ien的帖子

在缺少数据的时间范围内平均

假设一个表如:

UID     Name        Datetime                Users
4       Room 4      2012-08-03 14:00:00     3
2       Room 2      2012-08-03 14:00:00     3
3       Room 3      2012-08-03 14:00:00     1
1       Room 1      2012-08-03 14:00:00     2

3       Room 3      2012-08-03 14:15:00     1
2       Room 2      2012-08-03 14:15:00     4
1       Room 1      2012-08-03 14:15:00     3

1       Room 1      2012-08-03 14:30:00     6

1       Room 1      2012-08-03 14:45:00     3
2       Room 2      2012-08-03 14:45:00     7
3       Room 3      2012-08-03 14:45:00     8
4       Room 4      2012-08-03 14:45:00     4
Run Code Online (Sandbox Code Playgroud)

我希望从下午2点到下午3点获得每个房间(1,2,3,4)的平均用户数.问题是有时房间可能不会在15分钟的间隔时间"登记",因此必须假设前一个最后已知的用户计数仍然有效.

例如,2012-08-03 …

php mysql sql average date

16
推荐指数
2
解决办法
549
查看次数

CONCAT(专栏)OVER(PARTITION BY ...)?分组连接行而不对结果本身进行分组

我需要一种方法来在一种窗口函数中对所有行(每组)进行串联,就像你可以做的那样COUNT(*) OVER(PARTITION BY...),每个组的所有行的聚合计数将在每个特定的组中重复.我需要类似的东西,但是每个组中重复的每个组的所有值的字符串连接.

这是一些示例数据和我想要的结果,以更好地说明我的问题:

grp  |  val
------------
1    |  a
1    |  b
1    |  c
1    |  d
2    |  x
2    |  y
2    |  z
Run Code Online (Sandbox Code Playgroud)

这就是我需要的(期望的结果):

grp  |   val  |  groupcnct
---------------------------------
1    |   a    |  abcd
1    |   b    |  abcd
1    |   c    |  abcd
1    |   d    |  abcd
2    |   x    |  xyz
2    |   y    |  xyz
2    |   z    |  xyz
Run Code Online (Sandbox Code Playgroud)

以下是此问题的棘手部分:

我的特殊情况使我无法两次引用同一个表(我实际上是在递归CTE中执行此操作,因此我无法对CTE进行自联接,否则会引发错误).

我完全清楚可以做一些事情:

SELECT      a.*, b.groupcnct
FROM …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008 string-aggregation

10
推荐指数
1
解决办法
8365
查看次数

MySQL中的LEFT OUTER JOIN vs SUBSELECT

我有一张表说table1有3列column1, column2 and column3.

column1column2是一个FOREIGN KEY与其它2个表.但是,数据column3来自n个表.

例如,让我们考虑一下Facebook.要显示活动,它可能会维护一个可能具有user1 photoliked photo1或的表user1 statusliked status1.所以在这种情况下column3不能FOREIGN KEY用特定的表.

现在有两种获取真实数据的方法 -

第一路 -

SELECT user_id,
       verb_id,
       CASE WHEN verb_id = photoliked THEN
            (SELECT photo_name FROM photos WHERE photo_id = column3) -- getting the desired data from the third column
         WHEN verb_id = statusliked THEN
            (SELECT status FROM statustable WHERE status_id = column3) 
         ELSE '' END AS performedon …
Run Code Online (Sandbox Code Playgroud)

mysql sql join query-optimization

6
推荐指数
1
解决办法
2362
查看次数

mysql选择datetime字段小于指定值的所有记录

所以我试图运行一个将选择的查询,在这种情况下,没有预约的客户是X时间(例如2周).它归结为"向我展示一个未在2周内预约的客户名单".我试图通过做类似的事情来解决这个问题:

$date = new DateTime;
$ago = new DateInterval('P2W');
$target = $date->sub($ago);
//query to select clients that aren't scheduled after the $target date
$clients = ...;
Run Code Online (Sandbox Code Playgroud)

涉及两个表,appt_tblclients_tbl.appt_tbl为每个约会记录存储client_id.

基本上我需要的是为每个客户选择"最大"约会,如果它是<我的$目标日期,请将它们包含在查询结果中.我尝试了各种各样的查询,查询子查询,但我很难找到正确的查询.

我目前的尝试看起来像:

SELECT * 
FROM clients_tbl 
INNER JOIN
(
    SELECT client_id 
    FROM appt_tbl 
    WHERE MAX(appt_date_time) < '2012-07-22' 
    GROUP BY client_id
) appts ON appts.client_id = clients_tbl.client_id;
Run Code Online (Sandbox Code Playgroud)

这还应该包括从未安排过的客户(IE不会出现在appt_tbl中),但不包括在接下来的两周内预约的客户.

php mysql

6
推荐指数
1
解决办法
2万
查看次数

条件计数:使用SUM()和COUNT()的性能差异?

就像一个非常简单的例子一样,假设我有一个test包含样本数据的表,如下所示:

a     |     b      
-------------
1     |    18
1     |    24
1     |    64
1     |    82
1     |    10
1     |     7
2     |     5
2     |    18
2     |    66
2     |    72
3     |    81
3     |    97
Run Code Online (Sandbox Code Playgroud)

对于每一个a,我要计算有多少b是<50的结果.结果看起来像:

a     |   bcnt
--------------
1     |      4
2     |      2
3     |      0
Run Code Online (Sandbox Code Playgroud)

现在我可以用两种方式之一来实现这个结果:

SELECT a, COUNT(CASE WHEN b < 50 THEN 1 ELSE NULL END) AS bcnt
FROM test
GROUP BY …
Run Code Online (Sandbox Code Playgroud)

sql count query-optimization

5
推荐指数
1
解决办法
4459
查看次数

选择所有年龄范围内的用户

我在MySQL数据库中有用户,他们的生日以DATE格式(yyyy-mm-dd)存储.我想在PHP中选择具有特定年龄范围的数据库中的用户.

我所拥有的是最低年龄(18岁)和最高年龄(21岁).我知道我可以和BETWEEN做点什么,但问题是我只知道岁月而不是日期.

有没有人有关于我如何做到这一点的建议?

这就是我目前正在做的事情:

function leeftijden($age) { 
    $morgen['day']   = date('d'); 
    $morgen['month'] = date('m'); 
    $morgen['year']  = date('Y') - $age;

    $datum = $morgen['year'] .'-' .$morgen['month'].'-' .$morgen['day'];

    return $datum;
}
Run Code Online (Sandbox Code Playgroud)

然后我这样做:

$maxDatum = leeftijden(18);
$minDatum = leeftijden(32);
$sqlRijder = "SELECT * FROM rijder WHERE geboortedatum between '".$minDatum."' AND '".$maxDatum."'";
Run Code Online (Sandbox Code Playgroud)

但这不是100%的工作.

我怎样才能选择18到21岁之间的用户?

php mysql select

5
推荐指数
1
解决办法
2479
查看次数

选择每个组的第一行,使用ORDER BY多个列

我有一个表T的列x,y,a,b使得

SELECT x,y,a,b FROM T
ORDER BY x,y,a,b
Run Code Online (Sandbox Code Playgroud)

给我下表

 x    | y    | a    | b
 x1   | y1   | a1   | b1
 x1   | y1   | a1   | b2
 x1   | y1   | a2   | b1
 x1   | y2   | a1   | b1
 x1   | y2   | a1   | b2
 x1   | y2   | a2   | b1
Run Code Online (Sandbox Code Playgroud)

我如何获得每个x,y组的第一行?也就是说,我如何获得下表

 x    | y    | a    | b
 x1   | y1   | …
Run Code Online (Sandbox Code Playgroud)

sql performance sybase group-by sql-order-by

4
推荐指数
1
解决办法
1万
查看次数

重新加载页面后,打印MySQL行的下一行ID

我有一个简单的表单,我从一个MySQL表动态插入值:

<input type="text" name="title" value="1" size="45">
Run Code Online (Sandbox Code Playgroud)

该值="1"来自一个MySQL表,其id参数是自动递增的.所以以后id=12,3,4,5,6,7,8,9

当我提交表单,它再次重装,但我想要的id2下一次.然后第三次,它应该是3,然后4,然后5,等...

$res16 = sql_query("select * from mlf2_entries order by id desc limit 1 ");
    $row = sql_fetch_array($res16);
$textqb = $row['id'];   
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它总是显示值="1"

php mysql

1
推荐指数
1
解决办法
404
查看次数