2016-09-29 34 views
0

價值的三個表和收益最大我有三個表如下:如何內加入第三

第一個表:

ordenes

id_orden | date | total | id_usuario 
1  |15-may|50  | 1 
2  |20-may|60  | 2 

二表:

usuario

id_usuario | name | phone 
1   | abc | 999 
2   | def | 888 

第三表:

埃斯塔

id_orden | edo 
1  | c 
1  | b 
1  | a 
2  | b 
2  | a 

而且這是所期望的結果:

結果:

id_orden | date | total | id_usuario | name | phone | maxedo 
1  |15-may|50  | 1   | abc | 999 | c 
2  |20-may|60  | 2   | def | 888 | b 
  • maxedo需要從在江戶時代的最大記錄根據訂單彙總後的第三張表格。

我該怎麼做?

+0

那是什麼,你想要的?結果表? maxedo是我假設的彙總列表的最大值。 – AER

+0

是的,我需要sql statmente來獲得結果表,是的maxedo是最大字母no maters上傳順序 –

+0

另外,請記住接受其中一個適合您的答案,或者如果所有三個人都工作,最好的答案。 (並支持那些有用的)。它有助於跟蹤用戶(當然還有像我這樣的貢獻者)。 – AER

回答

-1

我認爲你需要從第三個表和id_orden組獲得最大值(edo),是嗎?嘗試這個。

select temp.*, max(edo) as maxedo 
from estado 
inner join(
    select ordenes.*,usuario.name,usuario.phone 
    from ordenes,usuario 
    where ordenes.id_usuario = usuario.id_usuario 
) as temp 
on temp.id_orden = estado.id_orden 
group by estado.id_orden 
+0

從不使用隱式連接,也永遠不要將它們與顯式連接混合,因爲當您這樣做時可能會得到意想不到的結果。 – HLGEM

+0

謝謝。我知道這一點,而且我知道告訴數據庫我們想要準確得到哪些列要好得多。我只想盡快爲他/她解決問題。基本技能是必要的。我會以更耐心和更細節的方式解決問題。再次感謝。 @HLGEM – stackoverflow

0

以下代碼示例爲您提供了結果。

CREATE TABLE #ordenes(id_orden int, datevalue date, total int, id_usuario int) 
INSERT INTO #ordenes 
VALUES 
(1,'20160515',50,1), 
(2,'20160520',60,2) 

CREATE TABLE #usuario(id_usuario int, name varchar(10), phone int) 
INSERT INTO #usuario 
VALUES 
(1,'abc',999), 
(2,'def',888) 

CREATE TABLE #estado(id_orden int, edo char(1)) 
INSERT INTO #estado 
VALUES 
(1,'c'), 
(1,'b'), 
(1,'a'), 
(2,'b'), 
(2,'a') 

SELECT id_orden,datevalue,total,id_usuario,name,phone,edo as maxedo 
FROM 
(SELECT o.id_orden,o.datevalue,o.total,o.id_usuario,u.name,u.phone,e.edo,ROW_NUMBER() OVER(PARTITION BY o.id_orden ORDER BY e.edo DESC) as rnk 
FROM #ordenes o 
JOIN #usuario u 
on o.id_usuario = u.id_usuario 
join #estado e 
on o.id_orden = e.id_orden) as t 
where rnk = 1 
+0

不知道他是否想創建表格,只是得到結果。從第一個SELECT開始的所有內容都是您想要的。 – AER

+1

理想情況下,他應該給代碼模仿他的場景。我認爲代碼示例可能有助於某人在將來嘗試該場景。 –

0

下面應該做的工作(假設edo實際上是一個數字量)。我已經使用AS命令包含了別名,因此您甚至可以獲得所需的列標題。

SELECT 
    oe.id_orden AS id_orden, 
    oe.date AS date, 
    oe.total AS total, 
    u.id_usario AS id_usuario, 
    u.name AS name, 
    u.phone AS phone, 
    oe.maxedo AS maxedo 
FROM usuario u 
INNER JOIN 
(SELECT 
    o.id_orden AS id_orden, 
    o.date AS date, 
    o.total AS total, 
    o.id_usuario AS id_usuario, 
    e.maxestedo AS maxestedo 
FROM ordenes o 
INNER JOIN 
(SELECT 
    id_orden AS id_orden, 
    MAX(edo) AS maxedo 
FROM estado 
GROUP BY id_orden) e 
ON e.id_orden=o.id_orden) oe 
ON u.id_usuario=oe.id_usuario 

在處理順序(這是不如何SQL的作品,但它分解爲若干步驟的有效途徑)有云:

  1. 創造最大EDOS表(注:MAX也適用於按字母順序);
  2. 使用id_ordene將此鏈接到ordenes;
  3. 將此連接到usuario數據使用id_usuario;和
  4. 以所需格式將其作爲表格發佈。
0

該問題可以被劃分爲以下三個步驟:

步驟1:計算最大江戶時代的每個表中的埃斯塔id_orden:

Select id_orden, max(edo) maxedo 
From estado 
Group By id_orden; 

結果:

| id_orden | edo | 
| 1  | c | 
| 2  | b | 

第2步:加入兩個表ordenes和usuario上的鍵 「id_usuario」:

Select o.id_orden, o.date, o.total, o.id_usuario, u.name, u.phone 
From ordenes o Join usuario u 
On o.id_usuario = u.id_usuario; 

結果:

id_orden | date | total | id_usuario | name | phone 
1  |15-may|50  | 1   | abc | 999 
2  |20-may|60  | 2   | def | 888 

步驟3:加入表形成在鍵id_orden的第一步和第二步:

Select a.id_orden, a.date, a.total, a.id_usuario, a.name, a.phone, b.maxestado 
From (Select o.id_orden, o.date, o.total, o.id_usuario, u.name, u.phone 
From ordenes o Inner Join usuario u 
On o.id_usuario = u.id_usuario) a 
Join (Select id_orden, max(edo) maxestado 
From estado 
Group By id_orden) b 
On a.id_orden = b.id_orden; 

結果:

id_orden | date | total | id_usuario | name | phone | maxedo 
1  |15-may|50  | 1   | abc | 999 | c 
2  |20-may|60  | 2   | def | 888 | b 

SQLFiddle例如:http://sqlfiddle.com/#!5/a79a1/2

:)

+0

我不知道我做錯了什麼,但我不能讓它工作: –

+0

你遇到了什麼問題? – Quote

+0

#1064 - 您的SQL語法錯誤;請查看與您的MySQL服務器版本相對應的手冊,以便在第1行的'選擇lc_t_ordenes.id_orden,lc_t_ordenes.fecha_registro,lc_t_ordenes.total,l'時使用正確的語法。 ***請參閱我的上一個答案*** –