【问题标题】:Querying data from SQL table basing on other rows values根据其他行值从 SQL 表中查询数据
【发布时间】:2014-04-01 20:15:55
【问题描述】:

标题听起来有点复杂,但如果没有例子,我很难解释我的意思。

所以我有一个带有树表的 SQL 数据库:

照片:

+------------+------------------+------+-----+-------------------+-----------------------------+
| Field      | Type             | Null | Key | Default           | Extra                       |
+------------+------------------+------+-----+-------------------+-----------------------------+
| id         | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |
| hash       | varchar(256)     | NO   | MUL | NULL              |                             |
| path       | varchar(1024)    | NO   | MUL | NULL              |                             |
| store_date | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+------------+------------------+------+-----+-------------------+-----------------------------+

标签名称:

+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name  | varchar(64)      | NO   | UNI | NULL    |                |
| type  | int(11)          | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+

标签:

+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| id       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| value    | varchar(2048)    | YES  |     | NULL    |                |
| name_id  | int(10) unsigned | NO   | MUL | NULL    |                |
| photo_id | int(10) unsigned | NO   | MUL | NULL    |                |
+----------+------------------+------+-----+---------+----------------+

Photos 是一张包含照片数据(id、照片路径和 sha 哈希)的表格。

Tag_names 收集有关可能标签的信息(id、标签名称及其类型,我在程序中将其映射到正确的类型,如字符串、数字、日期等)

Tags 包含有关哪些照片包含哪些具有标签值的标签的信息: name_id 是对 tag_names.id 的引用,photo_id 是对 photos.id 的引用,value 是标签的值。

我的问题是我想以树的形式可视化数据库中的数据。 一个例子:一个根节点将有子节点,其名称将是一个日期。在 tag_names 表中会有一个“日期”标签,并且在 tags 表中会有引用这个名称(通过 tags.name_id)和不同值的条目。

所以可视化:

select * from tag_names;
+----+------+------+
| id | name | type |
+----+------+------+
|  1 | Date |    1 |
+----+------+------+

select * from tags;
+----+------------+---------+----------+
| id | value      | name_id | photo_id |
+----+------------+---------+----------+
|  1 | 2011.05.19 |       1 |        1 |
|  3 | 2011.05.20 |       1 |        2 |
+----+------------+---------+----------+

会是这样的一棵树:

root
|
+--- 2011.05.19
     |
     +---- photo 1
     |
     2011.05.20
     |
     +---- photo 2

只要对tags 进行适当的查询,我就可以很容易地实现它。 但是我希望能够在树中创建两个(或更多)级别。

假设我想在我的树中添加日期和时间。 我仍然可以从第一级收集数据(查找名称为“日期”的标签的所有可能值),但是我想找到“时间”标签的所有可能值,但仅限于具有特定“日期”标签的照片。

所以我需要在tags 上创建一个select,其中标签名称等于“时间”,并且带有相关photo_id 的照片还包含具有一个特定值的标签“日期”。

我的表格布局可以吗? 我总是可以通过缓存一些数据来做到这一点,这是我最后的手段,但是我很好奇这样的问题是否可以直接用 SQL 解决。

编辑:

以下图片查询示例(在 cmets 中询问):

'1', 'cda6bfe0fd7a588704e1ebc81f8ef4b3c884895afadf0d0c97892db8f6d9cc91', '/DSCF9529.JPG', '2014-03-23 16:19:26'
'2', 'cda6bfe0fd7a588704e1ebc81f8ef4b3c884895afadf0d0c97892db8f6d9cc91', '/DSCF9529.JPG', '2014-03-23 16:19:26'
'3', 'e213df3f22276173c2e07a8c4ec9e83aee73605196d4e2aa529fbb34ceb6f86d', '/DSCF9532.JPG', '2014-03-23 16:19:26'
'4', '681a7c723ce16908c0fc73ed819de9a1af7c19cbd6fbcb7bf1c238a9d0378c2f', '/DSCF9531.JPG', '2014-03-23 16:19:26'
'5', 'd586eaae7d0fd625ec6282a51d12625db341c72d9395efd9e142850e457272ca', '/DSCF9537.JPG', '2014-03-23 16:19:26'
'6', 'dc1c40ce690c42f9fa9edc0f5020e01ca8e0c59694108d49f942b79b0167ef10', '/DSCF9222.JPG', '2014-03-23 16:19:26'
'7', '518884037e9d67ccbee98f6805cf7bb5ccf4c6f2e7aa35efe3c834e7c7ad3c32', '/DSCF9534.JPG', '2014-03-23 16:19:26'
'8', '21d33a2c5a25515689d68885d7d485aa89b96b7e5929a86ef658e53b61c7266b', '/DSCF9221.JPG', '2014-03-23 16:19:26'
'9', 'ff7ea451ce772b9d18c706dc9b989a1a318491e5d0f095575bf5dd6cc6448ab0', '/DSCF9530.JPG', '2014-03-23 16:19:26'

【问题讨论】:

  • 您可以添加用于获得第一级的查询吗? - 基本上你必须选择那个选择并加入一个选择,其中时间有你的日期标签
  • 这是我的选择:从标签中选择 photos.id、tag_names.name、tags.value 左连接(照片、tag_names)打开(photos.id=tags.photo_id AND tag_names.id=tags. name_id) WHERE name='日期';你能举个例子吗?这些是我使用 SQL 的第一步
  • 该查询有效吗?喜欢它拉出你想要的东西吗?
  • 您还可以从照片中选择 * 添加一些示例行吗?我正在构建一个 sql fiddle 来查询
  • 那个人为我收集了所有带有“日期”标签的照片。是的,它有效,我可以收集所有值。实际上,此查询比您的问题所需的要复杂一些(不需要来自photos 表的数据),但在我的程序中,我收集了更多数据

标签: mysql sql


【解决方案1】:

此查询选择标签名称为“DATE”的所有照片,然后选择标签名称为“TIME”的具有相同 ID 的照片,这是您想要的吗?有关工作示例,请参见 FIDDLE

SELECT 
    * 
FROM
(
    SELECT p.id AS p_id FROM photo p
    JOIN tag t ON t.photo_id = p.id
    JOIN tag_name tn ON tn.id = t.name_id
    WHERE tn.name = 'Date'
) AS ti
JOIN tag t1 ON t1.photo_id = p_id
JOIN tag_name tn1 ON tn1.id = t1.name_id
WHERE tn1.name = 'Time'

【讨论】:

  • 是的,它有效。我添加了更多数据,使其更复杂并且看起来有效。现在我需要尝试理解它;)
  • 好的,让我帮忙 :)... 首先你运行内部查询。仅获取标签名称为“DATE”的照片。连同这些照片是他们的身份证。所以我然后加入与只有“日期”作为标签名称的照片相关的 ID 的其他表。从那里你刚才说给我标签名称“时间”
  • 当我做JOIN tag t1 时注意到它的ON t1.photo_id = p_id --- p_id 是我在子查询中给 photo_id 的别名
  • 所以一旦它被链接然后你说过滤那些“时间”所以现在你在树的第二层:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多