MySQL Query Soru .. Ben pes!

4 Cevap php

Cevap verildi gibi * UPDATE, görünüyor, ama SQL sorgu onun üzerinden erroring .. herkes yardımcı olabilir? Ilk cevap bakın, orada sorun yayınlanmıştır.

Yani sadece bu koymak. Ben 3 tablolar var. "Madde" masa ve bir "tag" tablosu. Sonra ben de birlikte 2 bağlar bir "item_tag" tablo var.

Ben kendisine atanan belirli etiketler tüm öğeleri listeleyen bir sorgu yapmak istiyorum. Yani etiket x ve y etiketi kendisine uygulanan tüm öğeleri listelemek için sorgu istiyorum.

Bu şimdiye kadar .. hariç bu listeler bu etiket id 148 veya etiket id 152 ya uygun herhangi bir. Bunu dedirtecek "VE" Eğer sonucu gösterir ile geldi budur.

SELECT *
FROM (`item`)
RIGHT OUTER JOIN `item_tag` ON `item`.`id` = `item_tag`.`fk_item_id`
WHERE `item_tag`.`fk_tag_id` = "152" OR `item_tag`.`fk_tag_id` = "148"
GROUP BY `item`.`id`

4 Cevap

Eğer bu sorguyu kullanarak istediğiniz etiketlerin tümüne sahip öğelerin kimlikleri alabilirsiniz:

SELECT fk_item_id
FROM item_tag
WHERE fk_tag_id IN (5,10,15)
GROUP BY fk_item_id
HAVING COUNT(*) = 3

Ve sonra sadece

SELECT * 
FROM item 
WHERE id 
IN 
(
    SELECT fk_item_id
    FROM item_tag
    WHERE fk_tag_id IN (5,10,15)
    GROUP BY fk_item_id
    HAVING COUNT(*) = 3
)

Sen sadece bu kimlikleri sayısı olan kimlikleri ve 3 değiştirmek zorunda.

Masa UNIQUE kısıtlaması (olması gereken) yoktur ve belirli bir maddenin aynı etiketleri olabilir zaman bu sorguyu değiştirmeniz gerekir:

SELECT * 
FROM item 
WHERE id 
IN 
(
    SELECT fk_item_id
    FROM ( SELECT DISTINCT fk_item_id, fk_tag_id FROM item_tag ) someAlias
    WHERE fk_tag_id IN (5,10,15)
    GROUP BY fk_item_id
    HAVING COUNT(*) = 3
)

Ben etiketleri sıcaklık masa ve programlama dilinde sistem koymak. Bu sorguyu kullanarak bu sonucu var:

SELECT *
FROM (`item`)
INNER JOIN `item_tag` ON `item`.`id` = `item_tag`.`fk_item_id`
INNER JOIN `tag` ON `item_tag`.`fk_tag_id` = `tag`.`id`
WHERE `tag`.`desc` = 'Java' or `tag`.`desc` = 'C++'

Sonuç:

1, 'Sistem A', 1, 1, 1, 'Java'
1, 'Sistem A', 1, 3, 3, 'C++'
2, 'Sistem B', 2, 1, 1, 'Java'
2, 'Sistem B', 2, 3, 3, 'C++'

Bu durumda, sistem A ve sistem B kullanımı Java ve C + +. Kullanımı ayrı fıkra basitleştirmek için

SELECT distinct item.desc
FROM (`item`)
INNER JOIN `item_tag` ON `item`.`id` = `item_tag`.`fk_item_id`
INNER JOIN `tag` ON `item_tag`.`fk_tag_id` = `tag`.`id`
WHERE `tag`.`desc` = 'Java' or `tag`.`desc` = 'C++'

Sonuç:

System A
System B

Ben bu tabloları modeli olacağını umut ediyorum (size 3 tablolar söz ama ben sadece bu 2 si)

-- drop table item ;
-- drop table item_tag ;

create table item (
    id int not null auto_increment 
    , primary key ( id )
);
create table item_tag (
    fk_item_id int not null
,   fk_tag_id int not null
);

insert into item values ( 1 );
insert into item values ( 2 );
insert into item values ( 3 );

insert into item_tag values ( 1, 148 );
insert into item_tag values ( 1, 152 );

insert into item_tag values ( 2, 148 );

insert into item_tag values ( 3, 152 );

select i.id, a.fk_tag_id, b.fk_tag_id
from item i, item_tag a, item_tag b
where i.id = a.fk_item_id 
  and i.id = b.fk_item_id 
  and a.fk_tag_id = 148 
  and b.fk_tag_id = 152 
;

Çıkış üretir

+----+-----------+-----------+
| id | fk_tag_id | fk_tag_id |
+----+-----------+-----------+
|  1 |       148 |       152 | 
+----+-----------+-----------+
1 row in set (0.00 sec)

öğenin item.id = itemtag.fk_item_id ve item_tag.fk_tag_id = "152" veya item_tag.fk_tag_id = "148" grubundan item.id tarafından seçin *