根据特定设备上的视频记录查询所有兄弟视频记录

Query all siblings of video records according to those on a specific device

我已经将我的(几乎完整的)目录和文件名从多个存储设备存储在 MariaDB 数据库中。这里我有两个 table,DeviceNames 和 Dirs_and_Files。 Table 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

第二个table,Dirs_and_Files,包含以下字段:LNR是一个唯一的整数值,auto_incremented,字段D_Nr包含设备的编号路径和文件的存储位置。

此 D_Nr 值应与 table 设备中的 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

首先,我只想列出在 table 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;

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

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

如何在我的数据库中查询 table Dirs_and_Names 中的所有多个 mp4 视频文件(文件名),这些文件在特定设备编号 (D_Nr = 98) 上有同级文件?

感谢您的耐心等待,

-Linuxfluesterer

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

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;