Mysql katılın Sorgu aynı sonuçlar birden çok kez verir

2 Cevap php

İki tablo var. Bir items, ve bir tags olduğunu. Sorgu en here.

Fikir öğeleri arama ve ardından etiketleri seçerek aramanızı daraltmak için bir arama kutusu oluşturmaktır. (Yönlü arama çeşit).

Mysql öğreticiler etrafında işe yaramaz sonra ben bu ile geldi:

SELECT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`) 
WHERE (
    (`tags`.`type`='food' AND `tags`.`name`='pizza')
    OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade')
    --And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30

(Şu anda önemli değildir çünkü sorguda tam metin araması kaldırıldı)

Bu oldukça iyi çalışıyor, ama iki sorun var:

  1. Kullanıcı herhangi etiketlerini seçmezse, ona bağlı daha sonra 1 etiketi olan her madde daha sonra 1 süresini gösterir
  2. Kullanıcı iki etiketleri, gıda => pizza ve içecekler seçerse =>, pizza ya da limonata ya da her ikisi kadar gösterecektir her öğe, ben sadece ona bağlı İKİ bu etiketleri var öğeleri örnek limonata istiyorum.

Farklı bir mysql sorgusu ile bu sorunları çözmek mümkün mü? Yoksa php kodu bu sorunları düzeltmek gerekir. (Yoksa bu tamamen yanlış yapıyor, ve etiketlerini kullanmak çok daha iyi bir yolu var mı ki?)

Umarım kendimi açıkça.

, Gr

Bas

2 Cevap

SELECT, sonra DISTINCT anahtar atmak?

SELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc` 
FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)  
WHERE ( 
    (`tags`.`type`='food' AND `tags`.`name`='pizza') 
    OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade') 
    --And so on for every tag 
) 
ORDER BY `pay` DESC LIMIT 0 , 30 

İkinci soruna gelince ... mantık yanlış. Ben doğru anlamak Eğer items.id göre gruplandırmak istediğiniz ve sonra belki bir şey gibi ... Seçilen etiketleri sayısı gibi satır aynı sayıda geri gelmez öğeleri reddetmek:

SELECT DISTINCT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc` 
    FROM `items`LEFT JOIN (`tags`) ON (`tags`.`item_id`=`items`.`id`)  
    WHERE ( 
        (`tags`.`type`='food' AND `tags`.`name`='pizza') 
        OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade') 
        --And so on for every tag 
    ) 
    GROUP BY `items`.`id` 
    HAVING COUNT(*) = 2 
    ORDER BY `pay` DESC LIMIT 0 , 30 

... Ve COUNT HAVING 2 (*) = Eğer aynı anda maç için çalışıyoruz etiketlerin sayısı ile 2 yerine ...

Deneyin NEREDE tag.id IN (alt sorgu)

SELECT `items`.`id`, `items`.`name`, `items`.`pay`, `items`.`desc`
FROM `items`  WHERE items.id IN (SELECT DISTINCT item_id
   FROM tags
   WHERE (
    (`tags`.`type`='food' AND `tags`.`name`='pizza')
    OR (`tags`.`type`='drinks' AND `tags`.`name`='lemonade'))
    --And so on for every tag
)
ORDER BY `pay` DESC LIMIT 0 , 30