我有3个表# controller (writing quickly, code may not be totally right, hopefully you get gist
data = Hash.new
data["items"] = []
@order.items.each do |item|
item_hash = {
"name" => item.name,
"amount" => Amount.where(item_id: item.id).first.amount,
"refund" => Refund.where(item_id:item.id).first.amount
}
data["items"] << item_hash
end
# view code
<% data["items"].each do |item| %>
<td><%= item["name"] %></td>
<td><%= item["refund"] %></td>
<td><%= item["amount"] %></td>
<% end %>
,data
,actor
。我必须找到与演员&#34; ART Garfunkel&#34;合作过的人。
我有解决方案,但我无法理解以下查询的工作原理。
movie
还有一个解决方案:
casting
答案 0 :(得分:1)
这是MySQL的解决方案:
*
答案 1 :(得分:1)
简便解决方案:
SELECT distinct actor.name
FROM movie
JOIN casting
ON casting.movieid = movie.id
JOIN actor
ON actor.id = casting.actorid
where movie.id in (select movieid from casting join actor on id =actorid where
actor.name = 'Art Garfunkel') and actor.name <> 'Art Garfunkel'
答案 2 :(得分:0)
很难理解你的问题......这是我建议的解决方案:
SELECT
*
FROM
Actor A
INNER JOIN
Casting C
ON
C.ActorID = A.ID
WHERE C.MovieID IN (
SELECT
C.MovieID
FROM
Casting C
INNER JOIN
Actor A
ON
C.ActorID = A.ID
WHERE
Actor = 'Art Garfunkel'
)
WHERE
Actor <> 'Art Garfunkel'
子查询首先查找演员所在的所有电影。第二个外部查询查找在所述子查询中返回的电影中扮演过的所有演员。
答案 3 :(得分:0)
这是一个做同样事情的简化版本:
select actor.name
from (
select movieid from casting
join actor on actor.id = casting.actorid
and actor.name = 'Art Garfunkel'
) ag_movies
join casting on ag_movies.movieid = casting.movidid
join actor on actor.id = casting.actorid
and actor.name != 'Art Garfunkel'
您的步骤大致相同:
投射表是一个交叉查找表,允许许多演员在许多电影中表演。通过演员表我们必须找到Art所有的电影,然后反过来查找这些电影中的其他演员。
连接意味着结果只包含两个表中与连接条件匹配的行。因此on actor.id = casting.actorid and actor.name = 'Art Garfunkel'
通过匹配的ID连接表,但将结果限制为只有演员姓名为Art的ID。这些查询中使用的连接与集合理论中的交集相同。
括号内的子选择会创建一个临时表(在此示例中名为ag_movies),父查询可以像使用任何其他表一样使用该表。
答案 4 :(得分:0)
SELECT name FROM actor
JOIN casting ON actor.id = actorid WHERE casting.movieid IN
(SELECT movieid FROM casting WHERE name != 'Art Garfunkel' AND
actorid in (SELECT actor.id FROM actor WHERE name = 'Art Garfunkel'))
答案 5 :(得分:0)
SELECT name FROM actor
JOIN casting ON id=casting.actorid
WHERE movieid IN(
SELECT movieid FROM casting
WHERE actorid IN(
SELECT id FROM actor
WHERE name = 'Art Garfunkel'))
AND name <> 'Art Garfunkel'
答案 6 :(得分:0)
SELECT DISTINCT a.NAME
FROM casting c
JOIN actor a
ON c.actorid = a.id
WHERE c.movieid IN (SELECT c.movieid
FROM casting c
JOIN actor a
ON c.actorid = a.id
WHERE a.NAME = 'Art Garfunkel')
AND a.NAME <> 'Art Garfunkel'
ORDER BY 1
答案 7 :(得分:0)
下面的代码将解决此问题:
select distinct name
from actor
join casting on id=actorid
where actorid IN
(select actorid
from casting
where movieid IN
(select movieid
from casting
where actorid =
(select id from actor where
name= 'Art Garfunkel')
)
)
and
name <> 'Art Garfunkel'
答案 8 :(得分:0)
SELECT name
FROM actor
JOIN casting ON (actorid=id)
WHERE movieid IN (SELECT movieid
FROM casting
JOIN actor ON (actorid=id)
WHERE name='Art Garfunkel')
AND name<>'Art Garfunkel'
有问题的查询非常复杂。一个简单的查询将帮助您更好地理解逻辑流程。从子查询开始,我们选择由“ Art Garfunkel”主演的“电影”列表。主查询从子查询返回的电影列表中选择所有演员。在最后一步中,我们必须删除“ Art Garfunkel”本人的条目,否则他的名字也将出现在列表中。 “ Art Garfunkel”本人无法与“ Art Garfunkel”本人合作。
答案 9 :(得分:0)
SELECT name FROM actor
JOIN casting on actor.id= actorid
WHERE casting.movieid IN
(SELECT movie.id FROM movie
JOIN casting ON movie.id = movieid
JOIN actor ON actor.id = actorid
WHERE actor.name = 'Art Garfunkel') AND name <> 'Art Garfunkel'
我发现在分解之前,更容易理解以根级别转换代码。所以它是这样的: 获取演员Garfunkel所在的演员的名字,而不是Art Garfunkel的演员的名字
答案 10 :(得分:0)
SELECT name
FROM actor
WHERE id IN(SELECT c.actorid
FROM casting c
JOIN actor a ON c.actorid = a.id
WHERE c.movieid IN(
SELECT c.movieid
FROM casting c
JOIN actor a
ON a.id = c.actorid
WHERE a.name = 'Art Garfunkel')) AND NOT name = 'Art Garfunkel'