我有3张桌子:
大胆: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”类别的那些。
注意:'Novidade'就是我所说的'新' 我想要返回1,4,10。
为什么或有效,但和不起作用?如何使和工作?
答案 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;
请注意,CategoryName
和select
已删除group by
。
where
子句获取具有这两个类别的文章。 having
检查两者都在文章上。
答案 1 :(得分:3)
当然,您不理解AND
和OR
AND
- 表示条件之前 和 之后 AND
运算符应该满足。在您的情况下, CategoryName 的Hot
和New
都不可能有一行。
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更聪明的方式。