根据特定设备上的视频记录来查询所有视频记录的同级

问题描述

我已经从MariaDB数据库中的几个存储设备中存储了我(几乎完整的)目录和文件名。这里有两个表,DeviceNames和Dirs_and_Files。表DeviceNames包含两个字段。字段F_NR是唯一的,其中包含特定存储设备的编号。字段D_Name包含存储设备的名称

在这里存储所有存储设备。

MariaDB [DevicesPool]> show columns from Devices;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| D_Nr        | varchar(2)  | NO   | PRI | NULL    |       |
| D_Name      | varchar(50) | NO   |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
2 rows in set (0.001 sec)

Example records in table Devices:
01 Toshiba-1TB
02 Western-Digital-500GB
03 Seagate-4TB
04 Western-Digital-2TB
...
98 Zyxel-NAS

第二个表Dirs_and_Files包含以下字段:LNR是一个唯一整数值​​,自动递增,字段D_Nr包含存储路径和文件的设备的编号。

此D_Nr是一个值,应与表Devices中的D_Nr字段匹配。字段文件名包含已存储文件的基本名(文件名)。字段Path_and_File然后包含整个路径和文件名。

MariaDB [DevicesPool]> show columns from Dirs_and_Files;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| LNR             | int(11)      | NO   | PRI | NULL    | auto_increment |
| D_Nr            | varchar(2)   | NO   |     | NULL    |                |
| Filename        | varchar(100) | NO   |     | NULL    |                |
| Path_and_File   | varchar(250) | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
4 rows in set (0.000 sec)


Example records for Dirs_and_Files:
01 01 King_Kong.mp4 /Medien/Filme/King_Kong.mp4
02 01 Airport.mp4 /Medien/Filme/Airport.mp4
03 02 Black_Panther.mp4 /Movies/Films/Black Panther.mp4
04 03 Shining.mp4 /Daten/Filme/Shining.mp4
05 03 King_Kong.mp4 /Daten/Filme/King_Kong.mp4
06 04 Alien.mp4 /Daten/Science/Alien.mp4
...
1412 98 Black_Panther.mp4 /home/user/Black_Panther.mp4

首先,我只想列出在Dirs_and_Names表中出现多次的所有文件(mp4视频)。当我从Dirs_and_Files接收到编号为01、03、05和98的记录时,此问题已解决。我已经有一个查询可以执行此操作。

这是只列出多个视频的查询命令:

SELECT d.Path_and_File,p.D_Name 
FROM Dirs_and_Names d 
LEFT JOIN DeviceNames p 
  ON d.D_Nr = p.D_Nr 
INNER JOIN 
   (SELECT Filename 
    FROM Dirs_and_Names 
    WHERE Filename RLIKE "[.]mp4$" 
    GROUP by Filename 
    HAVING COUNT(Filename) > 1
   ) temp 
  ON d.Filename= temp.Filename 
ORDER BY d.Filename;

现在,我要列出所有存储在表Dirs_and_Names中的特定设备编号(D_Nr)上具有同级的多个文件(mp4视频)。 在这种情况下,我想列出“ Black_Panther.mp4”及其副本,它们也存储在设备号98和02中。

其他未存储在设备“ 98”上,因此应将其跳过。

如何查询Dirs_and_Names表中所有具有特定设备编号(D_Nr = 98)的同级文件的所有多个mp4视频文件文件名)?

感谢您的耐心等候,

-Linuxfluesterer

解决方法

考虑在另一个INNER JOIN上添加一个Dirs_and_Names以在特定设备上进行过滤:

SELECT d.Path_and_File,p.D_Name 
FROM Dirs_and_Names d 
LEFT JOIN DeviceNames p 
  ON d.D_Nr = p.D_Nr 
INNER JOIN 
   (SELECT Filename 
    FROM Dirs_and_Names 
    WHERE Filename RLIKE "[.]mp4$" 
    GROUP by Filename 
    HAVING COUNT(Filename) > 1
   ) agg 
  ON d.Filename= agg.Filename 
INNER JOIN Dirs_and_Names d2
  ON agg.Filename = d2.Filename
  AND d2.D_Nr = 98
ORDER BY d.Filename;