繁体   English   中英

如何使用SQLite基于相关表值从一组表中提取数据?

[英]How do I pull out data from a group of tables based on an related table value with SQLite?

我有一组桌子:

1) **nanoInst**:
rid | api_id | name | instLoc | instText | pixelPitch | logo | listImg

2) **nanoFiles**:
rid | api_id | name | fileType | fileLoc

3) **nanoInd**: 
rid | api_id | name

4) **nanoRelInd**: 
rid | inst_id | ind_id

5) **nanoGalleries**: 
rid | inst_id | file_id | gallery_order

我的原始SQL语句简单地从nanoInst表中选择了ID和名称,从nanoFiles中选择了文件位置,并从nanoInd中选择了存储nanoInst ID的nanoInd名称,并在其中实现了NanoInst和nanoInd的ID。

SELECT 
nanoInst.rid as instID, 
nanoInst.name AS nanoName, 
nanoFiles.fileLoc AS nanoFile, 
nanoInd.name AS indName 
FROM nanoInst 
LEFT JOIN nanoFiles ON nanoInst.logo = nanoFiles.rid 
LEFT JOIN nanoRelInd ON nanoInst.rid = nanoRelInd.inst_id 
LEFT JOIN nanoInd ON nanoRelInd.ind_id = nanoInd.rid

我需要调整此语句,以便仅在nanoFiles.fileType为“ video”的情况下得到结果。 我试着简单地添加WHERE nanoFiles.fileType='video'但返回0行,但我知道一些存在。

- 编辑 -

我发现,如果我可以计算该行视频中的项目数,然后运行WHERE子句进行过滤:

SELECT 
  nanoInst.rid as instID, 
  nanoInst.name AS nanoName, 
  nanoFiles.fileLoc AS nanoFile, 
  nanoInd.name AS indName, 
  nanoFiles.fileType as nanoType, 
  (SELECT
  COUNT(nanoGalleries.rid)
  FROM nanoGalleries
  LEFT JOIN nanoFiles ON nanoFiles.rid = nanoGalleries.file_id
  LEFT JOIN nanoInst ON nanoInst.rid = nanoGalleries.inst_id
  WHERE nanoFiles.fileType = 'video') AS vidCount
FROM 
  nanoInst 
  LEFT JOIN nanoFiles ON nanoInst.logo = nanoFiles.rid 
  LEFT JOIN nanoRelInd ON nanoInst.rid = nanoRelInd.inst_id 
  LEFT JOIN nanoInd ON nanoRelInd.ind_id = nanoInd.rid
WHERE vidCount > 0

问题是vidCount返回的视频总数不只是该行的计数/ nanoInst.rid

由于nanoRelInd或nanoInd中没有匹配的记录,因此记录可能已被过滤掉。 如果是这样,这应该可行。

SELECT 
  nanoInst.rid as instID, 
  nanoInst.name AS nanoName, 
  nanoFiles.fileLoc AS nanoFile, 
  nanoInd.name AS indName 
FROM 
  nanoInst 
  LEFT JOIN nanoFiles ON nanoInst.logo = nanoFiles.rid 
  LEFT outer JOIN nanoRelInd ON nanoInst.rid = nanoRelInd.inst_id 
  LEFT outer JOIN nanoInd ON nanoRelInd.ind_id = nanoInd.rid
WHERE 
  nanoFiles.fileType='video'

基于原始帖子中的评论和您提供的sqlfiddle:

   SELECT * 
     FROM nanogalleries
LEFT JOIN nanofiles on(nanofiles.rid=nanogalleries.file_id)
    WHERE nanofiles.filetype='video';

http://sqlfiddle.com/#!9/e318a/1/0

根据评论更新答案

   SELECT nanogalleries.inst_id,
          nanoinst.name                AS nanoName,
          nanoFiles.fileLoc,
          nanoInd.name                 AS indName,
          count(nanogalleries.inst_id) AS vidCount
     FROM nanogalleries
LEFT JOIN nanofiles  ON nanofiles.rid = nanogalleries.file_id
LEFT JOIN nanoinst   ON  nanoinst.rid = nanogalleries.inst_id
LEFT JOIN nanoRelInd ON  nanoinst.rid =    nanoRelInd.inst_id
LEFT JOIN nanoInd    ON   nanoind.rid =    nanorelind.ind_id
    WHERE nanofiles.filetype = 'video'
 GROUP BY nanogalleries.inst_id;

http://sqlfiddle.com/#!9/e318a/50/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM