0

我正在尝试创建一个选择,当它在我的另一个表的另一列中有 PDF 时不显示

SELECT * from blogs
|blogs|
 |id|  |number|
  1     423423
  2     432422
  3     123233
  4     324233
SELECT b.id, p.id, p.file_name FROM posts p, blogs b
|posts|
 |id|  |blog_id| |file_name|
   1       1       C://blog1.pdf
   2       1       C://blog2.pdf
   3       2       C://blog3.pdf

尝试做所有没有 PDF 的事情

|id|    |number|   
 3       123233
 4       324233
4

4 回答 4

1
SELECT b.id, b.number FROM posts p INNER JOIN blogs b ON b.id= p.blog_id WHERE p.file_name NOT LIKE '%.pdf'

试试这个。这就是它在 t-SQL 中的工作方式,不确定它在 MySQL 中是否相同

于 2013-10-28T22:54:30.227 回答
1

您想要进行左外连接(因此将包含没有帖子的博客),然后排除任何包含 (PDF) 帖子的博客。这在技术上称为反半连接。

它在标准 SQL 中的工作方式如下,据我所知,它应该在 T-SQL (MS SQL Server) 或 MySQL 中工作:

SELECT b.id, b.number
FROM blogs AS b
LEFT OUTER JOIN posts AS p
ON p.blog_id = b.id
WHERE p.blog_id IS NULL

这是假设帖子表中的所有行的文件名列都填充了 PDF 名称。如果情况并非总是如此,并且您只需要排除具有 PDF 帖子而不是其他类型文件的博客,则需要使用子查询:

SELECT b.id, b.number
FROM blogs AS b
LEFT OUTER JOIN (SELECT blog_id FROM posts WHERE file_name LIKE '%pdf') AS p
ON p.blog_id = b.id
WHERE p.blog_id IS NULL
于 2013-10-28T23:11:15.100 回答
1

你需要一个LEFT JOIN. 试试这个:

SELECT b.* FROM blogs b
LEFT JOIN posts p ON b.id = p.blog_id
WHERE p.blog_id IS NULL

输出:

| ID | NUMBER |
|----|--------|
|  3 | 123233 |
|  4 | 324233 |

在这里拉小提琴。

于 2013-10-28T23:11:30.957 回答
0

听起来您需要使用JOIN. 根据您的表结构,您需要将 blogs 表连接到 posts 表。像这样的东西:

SELECT b.id, b.number
FROM blogs b
    JOIN posts p ON b.id = p.blog_id

这假设您的帖子表有一个 blog_id 字段。如果没有,请加入两个表中的相应字段。请参阅下面的文章以了解有关联接的更多信息。

SQL 连接的可视化解释

于 2013-10-28T22:53:57.607 回答