SQL WHERE和AND不返回值

时间:2016-10-02 11:19:53

标签: sql sql-server inner-join

我有3张桌子:

  • 新闻( ArticleID ,标题,ArticleImage)
  • 类别( EntryID ArticleID CategoryID ,CategoryName)
  • CategoryList( CategoryID ,CategoryName)

大胆:PK 斜体:FK

我想要实现的目标:选择属于News'热门''新'的表CategoryName行。

这是我的疑问:

select 
    n.ArticleID, n.Title, n.ArticleImage, cl.CategoryName
from 
    News as n
inner join 
    Categories as c on n.ArticleID = c.ArticleID
inner join 
    CategoryList as cl on cl.CategoryID = c.CategoryID 
where 
    cl.CategoryName = 'Hot' 
    and cl.CategoryName = 'New'
group by 
    n.ArticleID, n.Title, n.ArticleImage, cl.CategoryName

但是,它不返回任何内容,但它应该,因为我在表News中有条目属于“新”和“热”两个类别。

如果不是

cl.CategoryName = 'Hot' and cl.CategoryName = 'New'

我用

cl.CategoryName = 'Hot' or cl.CategoryName = 'New'

它返回属于“Hot”类别的那些以及属于“New”类别的那些。

OR result, IN(,) result 注意:'Novidade'就是我所说的'新' 我想要返回1,4,10。

为什么有效,但不起作用?如何使工作?

4 个答案:

答案 0 :(得分:4)

当然不是。 CategoryName不能同时出现两件事。如果您想要两个组中的新文章,可以采用以下方式:

select n.ArticleID, n.Title, n.ArticleImage
from News n inner join
     Categories c
     on n.ArticleID = c.ArticleID inner join
     CategoryList cl
     on cl.CategoryID = c.CategoryID
where cl.CategoryName in ('Hot', 'New')
group by n.ArticleID, n.Title, n.ArticleImage
having count(distinct cl.CategoryName) = 2;

请注意,CategoryNameselect已删除group by

where子句获取具有这两个类别的文章。 having检查两者都在文章上。

答案 1 :(得分:3)

当然,您不理解ANDOR

之间的区别

AND - 表示条件之前 之后 AND运算符应该满足。在您的情况下, CategoryName HotNew都不可能有一行。

OR - 表示条件之前 OR运算符满足后再返回该行。在你的情况下,它返回结果。

但正确的方法是使用IN运算符

where cl.CategoryName IN ( 'Hot' , 'New' )

答案 2 :(得分:1)

以下是使用CTE获取结果的方法。

;with cte_1
 AS
(SELECT 
      n.ArticleID, n.Title, n.ArticleImage, cl.CategoryName
       ,COUNT(1) OVER(partition by   n.ArticleID, n.Title, n.ArticleImage, cl.CategoryName order by n.ArticleId) CNT
  FROM News as n
     INNER JOIN Categories as c on n.ArticleID = c.ArticleID
     INNER JOIN CategoryList as cl on cl.CategoryID = c.CategoryID 
   WHERE  cl.CategoryName IN ( 'Hot' ,'New')
 )
SELECT ArticleID, Title, ArticleImage, CategoryName
FROM cte_1
WHERE CNT =2

答案 3 :(得分:0)

并且永远不会起作用,因为没有存在热或新的行;我的意思是1,4,10有不同的行。

# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
import numpy as np
from pylab import *

# Estil de còmic XKCD
plt.xkcd()

# Etiquetes
fig = plt.figure()
plt.title("Distància vs velocitat de les carreres d'atletisme")
plt.xlabel('distància')
plt.ylabel('velocitat de l\'atleta (homes)')

# Configuracions
ax = fig.add_subplot(1, 1, 1)
ax.set_xlim([-10, 12000])
ax.set_ylim([-1, 11])
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()


# Noms
plt.annotate('5000m', xy=(5000, 5.6), arrowprops=dict(arrowstyle='->'), xytext=(4500, 4))

# Data
data = np.genfromtxt('taula-fins-10000.csv', delimiter=';', skip_header=1)
event7 = [ [z[0], z[1]] for z in data if z[0] == 5000]
x = [e[0] for e in event7]
y = [e[1] for e in event7]

# Dibuix    
plt.plot(x, y, 'o')
plt.savefig("grafic-amb-nomes-una-prova.png")

对于AND运算符 AND表示应该有一个类别名称为“New”和“Hot”的行。这是不可能的。你有4行1,4和&每个都有10行,但这6行中没有一行的类别名称为“新”和“热”。

对于OR / IN运算符 或者意味着选择那些类别名称为“Hot”或“New”的行,现在您将所有行都作为返回值。

我的方法 我只是选择“新”和“热”的值,并通过INNER JOIN选择它们的公共部分。什么都没有硬汉。我想你应该阅读更多关于SQL JOINS的内容。

是的,我选择最简单的方式,但你应该遵循@ Gordon更聪明的方式。