标签: select

获取 MySQL 中按列分组的最新行

我的问题似乎应该有一个比我想出的更简单的解决方案。从这个数据集开始:

日志表

+--------+-----------+------------------+---------+
| log_id | entity_id |       date       | comment |
+--------+-----------+------------------+---------+
|      1 | A         | 2012-10-23 07:50 | foo     |
|      2 | B         | 2012-10-23 07:59 | bar     |
|      3 | B         | 2012-10-23 08:11 | baz     |
|      4 | A         | 2012-10-23 08:23 | bat     |
+--------+-----------+------------------+---------+
Run Code Online (Sandbox Code Playgroud)

假设我想获取每个实体的日志条目的最新日期,以便结果如下所示:

Results:
+-----------+------------------+--------------+
| entity_id |  last_log_date   | last_comment |
+-----------+------------------+--------------+
| B         | 2012-10-23 08:11 | baz          |
| A         | 2012-10-23 08:23 …
Run Code Online (Sandbox Code Playgroud)

mysql select query-refactor

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

选择条目不为空的列名

我想要一个表中至少有一个非NULL数据条目的那些列的列表。

换句话说,我想获取以下返回至少一个条目的列名称:

SELECT DISTINCT column_name FROM table WHERE column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

SELECT column_name
FROM information_schema.columns
WHERE table_name = "table_name"
AND EXISTS (
    SELECT DISTINCT column_name FROM table_name WHERE column_name IS NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

但这也会返回所有条目所在的列名NULL

那么如何只获取那些没有NULL条目的列呢?

mysql null database-design select

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

带有 JOIN 和 GROUP BY 查询的 SELECT 中的错误“列不存在”

我将 PostgreSQL 9.1 与 Ruby on Rails 应用程序一起使用。

我正在尝试列出属于同一项目 ID (proj_sous_projet_id = 2) 的每个“费用”(在我的历史表中:hist_version_charges)的最后一个版本。

这使我使用 max() 聚合函数并将结果应用于同一个表上的 JOIN 函数,因为如果 SELECT 子句中的列未出现在 GROUP BY 子句中,则 PostgreSQL 没有授权使用它们,但使用最大值() 显然我对包含最大值的行感兴趣!

这是我的查询:

SELECT h_v_charges.*, 
       max(last_v.version) as lv 
FROM hist_versions_charges h_v_charges 
    JOIN hist_versions_charges last_v 
      ON h_v_charges.version = lv 
    AND h_v_charges.proj_charge_id = last_v.proj_charge_id 
GROUP BY last_v.proj_sous_projet_id, 
         last_v.proj_charge_id 
HAVING last_v.proj_sous_projet_id = 2 
ORDER BY h_v_charges.proj_charge_id ASC;
Run Code Online (Sandbox Code Playgroud)

我得到的错误信息:

ERROR:  column "lv" does not exist
LINE 1: ..._versions_charges last_v ON h_v_charges.version = lv AND h_v...
                                                             ^
********** Error ********** …
Run Code Online (Sandbox Code Playgroud)

postgresql join select group-by

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

MySQL:在列中拆分值以获取多行

我在表中有一些数据,如下所示:

product_id      | categories
----------------+-------------
10              | 9,12
11              | 8
12              | 11,18,5
Run Code Online (Sandbox Code Playgroud)

我想要一个会产生这个输出的选择语句:

product_id      | category_id
----------------+-------------
10              | 9
10              | 12
11              | 8
12              | 11
12              | 18
12              | 5
Run Code Online (Sandbox Code Playgroud)

我不知道如何表达这种情况才能用谷歌搜索它。

mysql select

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

从同一列中选择多个值;一条sql语句

我希望从数据库中返回用户列表。数据库中有数百个用户。每个用户都有自己唯一的 user_id。我尝试返回的所有值都位于同一列 (meta_value) 中。

数据库结构如下:

id | user_id | meta_key | meta_value
Run Code Online (Sandbox Code Playgroud)

样本数据如下:

1 | 3434 | 名字| 布兰登
2 | 3434 | 姓氏 | 约翰逊
3 | 3434 | street_add | 123主
4 | 3434 | 城市 | 海洋海滩
5 | 3434 | 状态 | 德克萨斯州

我试图在一个 sql 语句中返回名字、姓氏、street_add、城市和州。

我希望输出看起来像:

Brandon, Johnson, 123 Main, Ocean Beach, Texas 
Run Code Online (Sandbox Code Playgroud)

mysql select

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

在具有多个条件的一个查询中选择多行

我可以使用以下内容选择具有一个条件的多行:

SELECT `Col`, `Col2` FROM `Table` WHERE `Col3` IN (?, ?, ?, ?, ?);
# This selects 5 rows
Run Code Online (Sandbox Code Playgroud)

如果有多个条件(所有整数等于运算),如何做到这一点?

查询需要检查三个条件,所有这三个条件构成了复合主键。

单个查询将选择 10 到 100 行(尽管大多数情况下只有 10 行)——它在性能方面必须很快。这就是为什么使用多个查询不是一个好主意。

CREATE TABLE声明是:

CREATE TABLE `Table Name` (
  `X` smallint(6) unsigned NOT NULL,
  `Y` smallint(6) unsigned NOT NULL,
  `Z` smallint(6) unsigned NOT NULL,
  `Data` varchar(2048) NOT NULL DEFAULT '',
  PRIMARY KEY (`X`,`Y`,`Z`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

对于多个查询,可以这样做:

SELECT `One`, `Two` FROM `Table` WHERE `X` = ? AND `Y` = ? AND …
Run Code Online (Sandbox Code Playgroud)

mysql select

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

在多列中搜索多个值

我有一个包含这些字段的表结果:

  • ID
  • 结果 ID
  • number_one (int)
  • number_two (int)
  • number_three (int)
  • number_four (int)
  • 数字五(整数)

每个 number_* 列可以包含一个从 01 到 90 的数字。

我有一个带有 90 个复选框的搜索表单。用户最多可以勾选 5 个复选框。

一旦用户选择 n 复选框,我需要构建一个查询来查找包含所有这些值的行,但数字可以位于五列中的任何一列。

例子:

用户勾选复选框 02、12 和 20。我需要检索所有三个数字的所有行,但我的数字可以在任何 number_* 列中。20 可以在 number_one 列中,02 可以在 number_three 列中,12 可以在 number_four 列中。如何构建此查询?

另外,使用一列而不是五列会更好吗?结果表:

  • ID
  • 结果 ID
  • 数字(字符串)

列号包含 02-12-20-57-84,其中 - 是分隔符。

示例:用户勾选复选框 02、12 和 20。所以我的查询将是

SELECT * 
FROM results 
WHERE numbers LIKE "%02%" 
    AND numbers LIKE "%12%" 
    AND numbers LIKE "%20%";
Run Code Online (Sandbox Code Playgroud)

更新:我目前正在使用 MySQL 进行此设置:

  • ID
  • 结果 ID
  • number_one …

mysql performance select where query-performance

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

Like 谓词只匹配整个单词

我有一个 SQLite 数据库,其中有一个名为minecraft.

+----+----------------------+
| id |         name         |
+----+----------------------+
|  1 | Pocket Mine MP       |
|  2 | Open Computers       |
|  3 | hubot minecraft skin |
|  4 | Terasology           |
|  5 | msm                  |
+----+----------------------+
Run Code Online (Sandbox Code Playgroud)

我需要找到所有在其“名称”字段中包含“e”和“o”的记录。这是我的选择查询:

select * from minecraft where name like '%e%o%'
Run Code Online (Sandbox Code Playgroud)

以下是上述查询的结果:

+----+----------------+
| id |      name      |
+----+----------------+
|  2 | Open Computers |
|  4 | Terasology     |
+----+----------------+
Run Code Online (Sandbox Code Playgroud)

问题是 Like 谓词匹配整个值,而不是单词。不应该匹配 id = 2 的行,因为所有条件都没有出现在一个单词中('e' 出现在第一个单词中,'o' …

sqlite select like

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

检索尚未分配到工作的车辆驾驶员的数据

过去 24 小时都在为某事挣扎。需要一些天才来发光。我正在尝试为驱动程序显示每周工作循环/日志,它将显示:

  • 尚未分配给司机的工作
  • 已分配给司机的工作
  • 如果作业已分配给驱动程序,则显示当天可用的驱动程序
  • 如果当天没有工作,则显示所有可用驱动程序的列表

最后2点是我真正挣扎的地方。

我有以下表格:

drivers ('driver_id', 'driver_name')

vehicles ('vehicle_id', 'vehicle_make', 'vehicle_model')

jobs ('job_id', 'collection_address', 'collection_datetime', 'delivery_address', 'deliver_datetime', 'driver_id', 'vehicle_id') 
Run Code Online (Sandbox Code Playgroud)

我附上了下面的输出屏幕:

在此处输入图片说明

例如,如果您查看 23/09/2016,司机 Keith 正在工作,但 Nick 有空。但是,如果我执行子查询,它会显示两个驱动程序,这不是正确的结果。我的 SQL 语句如下,如果有人可以提供帮助,我将不胜感激。

    SELECT listofdays.job_date, j.job_id, IF( j.driver_id > 0 AND j.job_id > 0, (SELECT driver_name FROM t_drivers WHERE driver_id = j.driver_id LIMIT 1), '') as job_driver, IF( j.vehicle_id > 0, (SELECT vehicle_reg FROM t_vehicles WHERE vehicle_id = j.vehicle_id LIMIT 1), 'no') as job_vehicle, j.collection_town, j.collection_postcode, j.delivery_town, j.delivery_postcode, j.job_status
 FROM …
Run Code Online (Sandbox Code Playgroud)

mysql performance subquery select query-performance

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

SQL 查询问题(列中没有值的项目)

这是我需要用一些 T-SQL Magic 解决的难题,我尝试过但失败了。

这是其中之一,在我想到实际解决方案之前,我认为我可以在 3 分钟内使用一些 T-SQL 解决,但是当“橡胶遇到道路”时,我无法在脑海中想象正确的运算符来实现这个逻辑。

我想知道 Stack Exchange 社区中是否有人可以找到一个优雅的解决方案。我想通过使用临时表或游标的 3 或 4 个查询的组合,我可以找到解决方案,但它不会基于 SET...

我有一张看起来像这样的桌子(或多或少......)

CREATE TABLE Computers (
   ID               int IDENTITY(1,1),
   ComputerName     varchar(255),
   OS               varchar(255),
   AppName          varchar(255),
   AppVersion       varchar(10)
)
Run Code Online (Sandbox Code Playgroud)

因此,每一行都有一个计算机名称、一个操作系统值(可以是 Windows 7 或 Windows 10),然后是应用程序的描述(例如 AppName = "Notepad++", AppVersion = "7.5.6")

ComputerName   | OS           | AppName   | AppVersion
Computer 1     | Windows 7    | App 1     | 1.0
Computer 1     | Windows 7    | App 2     | 1.0
Computer 1     | Windows 7    | …
Run Code Online (Sandbox Code Playgroud)

t-sql select

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