我正在阅读一本关于SQL的书,我被困在一个与数据库模式相关的示例中,如下图所示.
下面的示例解决了书中所述的查询:
假设我们希望回答查询"列出教师的名字以及他们教授的课程的标题."查询可以用SQL编写,如下所示:
select name , title
from instructor natural join teaches , course
where teaches.course id = course.course id;
Run Code Online (Sandbox Code Playgroud)
现在这本书说明了这一点
"请注意,where子句中的teaches.course id指的是自然连接结果的课程id字段,因为该字段又来自教学关系."
这本书再次在BOLD中说:
"不可能使用包含原始关系名称的属性名称(例如instructor.name或teaches.course id)来引用自然连接结果中的属性;但是,我们可以使用属性名称,例如名称和课程ID ,没有关系名称."
(参考上面的查询)如果不可能,那么作者如何能够将查询编写为
teaches.course id = course.course id
Run Code Online (Sandbox Code Playgroud)
如何将teaches.course引用自然连接属性"课程",作者如此模糊地提出了他的论点.请向我解释作者的观点.
我正在使用代码点火器实现连接查询.我有两张桌子
1) Users -> Contains all users
2) Query -> Contains queries assigned to users. Each query has two users to attend that query.
Run Code Online (Sandbox Code Playgroud)
在Queries表中,我有两列
1) attendingMD -> First user attending that query
2) secondAttendingMD -> Second user that query.
Run Code Online (Sandbox Code Playgroud)
我想显示查询列表以及参与该查询的两个用户的名称.我设法通过使用此代码获得第一个用户的名称.
$this->db->select("Query.*, Users.fullname as firstMD");
$this->db->join('Users', 'Users.id = Query.attendingMD');
$this->db->where('Query.isCompleted', 1);
$query = $this->db->get('Query');
return $query->result_array();
Run Code Online (Sandbox Code Playgroud)
我有两个表:团队(id,name)和用户(id,name,team_id)
我想得到以下结果:
Team | Members
team1 | 10
team2 | 14
team3 | 8
Run Code Online (Sandbox Code Playgroud)
我试过了:
SELECT t.name AS 'Team', COUNT(u.email) AS 'Members' FROM teams t INNER JOIN users u ON (u.team_id = t.id)
Run Code Online (Sandbox Code Playgroud)
但它不会起作用.
我不会理解为什么排序不能正常使用"ORDER BY average,votes DESC",因为我需要最高的平均值并且投票从上到下,但是DESC没有解决什么问题.我在var_dump http://pastie.org/private/b05smuh0fvw72wwp2w1zq最高entrie的结果在底部,但我需要从顶部开始并且到底部.
SELECT c.*, r.votes, c.total_comments,
ROUND(sumrate / votes) AS average
FROM catalog c LEFT JOIN
(SELECT r.object_id, COUNT(*) as votes, SUM(r.rate) as sumrate
FROM ratings r
GROUP BY r.object_id
) r
ON r.object_id = c.catalog_id LEFT JOIN
(SELECT c.catalog_id, COUNT(*) as total_comments
FROM comments c
GROUP BY c.catalog_id
) c
ON c.catalog_id = c.catalog_id
GROUP BY c.catalog_id
ORDER BY average, votes DESC;
Run Code Online (Sandbox Code Playgroud) 我有三张桌子:
如您所见,这三个表都已连接.我想要的是返回所有章节(即使没有课程),所有课程(即使没有案例)和所有案例.
我很遗憾地说,但我真的没有想法所以我没有示例代码.我希望我的解释已经足够了.
如果内连接和左连接都可以实现相同的结果,哪一个更快并且具有更好的性能(特别是对于大数据)?
内部联接:
SELECT *
FROM Table_A A
INNER JOIN Table_B B
ON A.PK_A = B.PK_B
Run Code Online (Sandbox Code Playgroud)
左连接:
SELECT *
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK_A = B.PK_B
WHERE A.PK_A = B.PK_B
Run Code Online (Sandbox Code Playgroud)
表A:
PK_A User
1 FOX
2 COP
3 TAXI
6 WASHINGTON
7 DELL
5 ARIZONA
4 LINCOLN
10 LUCENT
Run Code Online (Sandbox Code Playgroud)
表-B:
PK_B Message
1 TROT
2 CAR
3 CAB
6 MONUMENT
7 PC
8 MICROSOFT
9 APPLE
11 SCOTCH
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?如何测试大数据的性能?
我想加入许多不同列表列表的相同索引元素,并获得连接元素列表的列表.列表总是具有相同的长度.这是一个更容易理解的例子.
list1 = [[1, 0], [1, 0], [1, 0], [0, 1]]
list2 = [[2, 1], [2, 1], [1, 2], [3, 2]]
Run Code Online (Sandbox Code Playgroud)
结果我想获得:
LIST = [[1,0,2,1],[1,0,2,1],[1,0,1,2],[0,1,3,2]]
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
给定多个驻留表,我想基于不同表中的字段创建一个新字段.
table1:
LOAD * INLINE [
id1,val1
a1,car1
a2,car1
];
table2:
LOAD * INLINE [
id2,id1,val2
b1,a1,type1
b2,a2,type2
];
table3:
LOAD * INLINE [
id3,id2,val3
c1,b1,mfr1
c2,b2,mfr2
];
Run Code Online (Sandbox Code Playgroud)
为了参数,假设table1
有~1M行,table2
~1K行和table3
~10行.我想创建一个新字段,该字段可以添加到table1
或者可能在链接的新表中id1
,从而导致:
id1 val1 newval
a1 car1 car1type1mfr1
a2 car2 car2type2mfr2
Run Code Online (Sandbox Code Playgroud)
努力:
newtable:
load val1 & val2 & val3 as newval;
Run Code Online (Sandbox Code Playgroud)
没有错误,但没有newtable
或newval
.
newtable:
left join (table2)
load val1&val2 as newval resident table1;
Run Code Online (Sandbox Code Playgroud)
Errs with Field not found - <val2> …
我正在使用MySql数据库.我需要将多个(超过10个)表格中的信息合并为一个表格.为了做到这一点,我遵循典型的加入方式.
Select * from
table_1
Join table_2
on(table_1.id = table_2.id)
Join table_3
on(table_1.id = table_3.id)
Run Code Online (Sandbox Code Playgroud)
它有效,但在执行期间我受了很多苦.有没有其他好方法来优化我的代码?以下是我的代码示例:
SELECT
distinct
u.Id,
oc.dt,
Daily_Number_Outgoing_Calls,
Daily_Number_Incoming_Calls,
Daily_duration_Outgoing_Calls
FROM
creditfix.users u
JOIN
#1 Daily_No_Out_Calls
(
SELECT
cl.uId,SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Outgoing_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=2 #out going calls only
GROUP by cl.uId,dt
) oc
ON (u.Id=oc.Uid)
#2 Daily_No_In_Calls
JOIN
(
SELECT
cl.uId, SUBSTRING(DATE,1,10) as dt,
count(1) as Daily_Number_Incoming_Calls
From creditfix.call_logs as cl
WHERE
cl.`type`=1 #incoming calls only
GROUP by cl.uId,dt
) ic …
Run Code Online (Sandbox Code Playgroud) 我想加入第一个到第16个单词和第17个到第31个等,在一个数组中,空格到一行,但不知道为什么代码不起作用.希望在这里得到帮助.谢谢
my @file = <FILE>;
for ( $i=0; $i<=$#file; $i+=16 ){
my $string = join ( " ", @file[$i..$i+15] );
print FILE1 "$string\n";
}
Run Code Online (Sandbox Code Playgroud)
以下是我档案的一部分.
1
2
3
...
Run Code Online (Sandbox Code Playgroud)
我要打印的是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
17 18 19 20 21....
Run Code Online (Sandbox Code Playgroud)