2016-03-23 21 views
1

numaralı listede bulunmadığını seçin, her yerde aradım ama bir cevap bulamadım. Yani sorun doğru.MySQL, en az bir değerin

Bir attr eksik sıranın kimliği almak için bir sorgu istiyorum ben bu

table1 
+------+--------+ 
| id | attr | 
+------+--------+ 
| 1 | weight | 
| 1 | width | 
| 1 | length | 
| 2 | width | 
| 2 | length | 
+------+--------+ 

gibi bir tablo var diyelim. Bu durumda, kimlik denetimi çekilişi, örn. ('ağırlık', 'genişlik', 'uzunluk', 'yükseklik') veya bir seç. SELECT DISTINCT attr FROM table1 WHERE id = 1.

NOT IN ve NOT EXISTS ile denedim ancak yalnızca 0 veya tüm sonuçları alabilirim.

SELECT id FROM table1 
WHERE attr NOT IN ('weight', 'length', 'width','height') 

ve

SELECT id 
FROM table1 t1 
WHERE NOT EXISTS 
     (
     SELECT 1 
     FROM table1 t2 
     WHERE t2.name NOT IN('weight', 'length', 'width','height') 
    ) 

DÜZENLEME

tablo

aşağıdaki alıyorum nasıl
+------+--------+ 
| id | attr | 
+------+--------+ 
| 1 | weight | 
| 1 | width | 
| 1 | length | 
| 1 | height | 
| 2 | width | 
| 2 | length | 
| 2 | other | 
+------+--------+ 

gibi olur? yani. Satır kimliği için kayıp attr Bunu yapmanın birkaç yolu vardır

+------+--------+ 
| id | attr | 
+------+--------+ 
| 2 | width | 
| 2 | length | 
+------+--------+ 
+0

benzersiz değilse o Kimlik sütunu amacı yendi bilmelidir: Burada birini kullanarak toplama var. –

+0

Buradaki kimlik basittir, sadece tanıtım amacıyla ürün numarası gibi bir şey olabilir. –

cevap

0

(id Ben yorum açıklandığı gibi sadece bir takma ad değil birincil anahtar id).

select id 
from table1 
where attr in ('weight','length','width') 
group by id 
having count(distinct attr) <> 3 
+0

Çok teşekkür ederim. Tam olarak ne istedim! –

+0

ayrıca eksik olanı almanın bir yolu var mı? Gibi: | 2 | ağırlık | –

+0

bir düzenleme ekledi. Böyle bir şey yapmak mümkün mü? –

0

Sen having maddesi ile group by kullanabilirsiniz ör .:

select id 
from table 
where attr in ('weight','width','length') 
group by id 
having count(distinct(attr)) < 3 
+0

Hızlı cevapladığınız için teşekkür ederiz, ancak sgedeler daha hızlıydı, bu yüzden kabul edilenler ona gidecek. –

İlgili konular