2017-03-03 99 views
0

表中有4列如下:如何從表中選擇那些條件?

id  int(11) not null primary key, 
name  varchar not null , 
status tinyint(1) not null, 
created datetime not null 

現在,我想和條件,找出結果行:

  1. 狀態爲0;
  2. 的foreach結果行作爲A,如果表中可以選擇列名B中具有相同的namecreated是同一天status是1,除了A.

會有人選擇結果與沒有嵌套選擇的SQL,非常感謝!

+0

我不完全確定你的要求是什麼,但你有嘗試過自我加入嗎? –

+0

@digjack - 所以,如果你有條件「狀態爲0」,那麼第二個條件「狀態爲1」將如何? –

+0

我不確定是誰投票結束這個問題,因爲「太寬泛」,即「太多可能的答案或者好的答案會太長」。這是一個反連接。沒有其他「好」的答案。好的,所以有很多可能的*錯誤的答案。但是這並不能使問題「太寬泛」,來吧。 (如果我們要關閉它應該是因爲它是重複的問題) – spencer7593

回答

1

聽起來像反連接模式符合法案。這種模式需要兩個引用表,但只有一個SELECT關鍵字。舉個例子:

SELECT t.id 
     , t.name 
     , t.status 
     , t.created 
    FROM the_table t 
    -- anti-join exclude matching rows 
    LEFT 
    JOIN the_table d 
    ON d.name = t.name 
    AND d.status = 1 
    AND d.created >= DATE(t.created) 
    AND d.created < DATE(t.created) + INTERVAL 1 DAY 
    WHERE d.name IS NOT NULL 
    AND t.status = 0 

訣竅是外連接,從td返回所有行,用匹配的行,一起條件的WHERE子句在排除是有一個匹配的所有行。僅保留t中與d沒有匹配行的行。

0

name沒有在具有第二個條件行:

SELECT * FROM tablename as o 
WHERE o.status = 0 
    AND o.name NOT IN 
    (
    SELECT `name` FROM tablename as i 
    WHERE i.status = 1 
     AND i.created 
      BETWEEN DATE(t.created) 
       AND DATE(t.created) + INTERVAL 1 DAY 
    ) 
0

試試這個:

select a.id,a.name,a.created,a.status from 
(select b.id,a.name,b.created,b.status from 
(select count(name) as cnt, name from tbl_sample as a GROUP BY name) as a 
LEFT JOIN 
(select * from tbl_sample) as b 
on a.`name` = b.`name` where cnt>1 and STATUS = 0) as a 

LEFT JOIN 


(select b.id,b.name,b.created,b.status from 
(select count(created) as cnt, created from tbl_sample as a GROUP BY created) as a 
LEFT JOIN 
(select * from tbl_sample) as b 
on a.`created` = b.`created` where cnt>1 and STATUS = 0) as b 
on a.id = b.id 
+0

這將返回連續的狀態= 0的結果(同名和同一創建) –

+0

這可能會返回指定的結果,但我統計出7次SELECT關鍵字。指定OP要求的一部分:「沒有嵌套選擇」。 – spencer7593

0
SELECT a.id, a.name, a.status, a.created 
FROM userTable as a 
LEFT JOIN userTable as b 
ON a.name = b.name 
AND b.status = 1 
AND b.created BETWEEN DATE(a.created) AND DATE(DATE_ADD(a.created, INTERVAL 1 day)) 
WHERE a.status = 0 
AND a.name IS NULL; 

感謝來自@ spencer7597答案,我發現的結果。

+0

關於「b.created BETWEEN」的一個注意事項這是做了一個「小於或等於」的上限比較。上限是* next * day的午夜。正常模式是與* next * day的最早時間進行「小於」比較,而不是「小於*或等於*」的比較。 – spencer7593

+0

我明白了,謝謝! – digjack