MySQL ile en etiketlendi etiketi Sayma

3 Cevap php

Benim sorunum kullanıcı gönderilen bir kod tabloda en çok kullanılan olmuştur hangi etiketi saymak çalışıyorum olmasıdır. Ama sorun veritabanı yapısı ile.

I istimal geçerli sorgu şudur:

SELECT tag1, COUNT(tag1) AS counttag 
FROM code 
GROUP BY tag1 
ORDER BY counttag DESC LIMIT 1

Ve benim veritabanı yazılan başına 5 etiketleri var - - sadece Tag1 Oluşumunu en sık sayar, dışında bu, ince yani sütunlar tag1, tag2, TAG3, tag4, Tag5 var. Nasıl ben bir sorguda bütün 5 sütun gelen yüksek ortaya çıkan etiket değeri alabilirim?

Kriko

3 Cevap

2-3 tablolar yapmak gerekir. Ben genellikle 3 yapmak:

kod

  • kimlik
  • kod

kod_tags:

  • kod_kimlik
  • tag_kimlik

tags:

  • kimlik
  • isim

Kullanılan etiketlerin miktarını gösteren bir sorgu yapmak için:

   SELECT t.*, COUNT(tag_kimlik) as kod_count 
     FROM kod_tags ct 
LEFT JOIN tags t ON ct.tag_kimlik = t.kimlik 
 GROUP BY tag_kimlik 
 ORDER BY kod_count DESC 
    LIMIT 1
Select tag, Count(tag) AS counttag 
From (
    Select tag1 As tag
    From code
    Union All
    Select tag2 As tag
    From code
    Union All
    Select tag3 As tag
    From code
    ...
) t
Group BY tag
Order BY counttag Desc Limit 1

: Daha iyi bir yaklaşım (ayrıca bkz mark_dj's answer) tabloları normalleştirmek olacaktır

Tablo code_tag (bir kod tüm etiketleri içerir):

Code_id
Tag

Peki, sizin veritabanı yapısı sorun olduğunu haklısınız.

Sen could alt sorgular içeren bir SQL sorgusu, aynı masanın üzerinden geçen ve her etiket alanı hakkında bilgi çekerek her bir tane oluşturun. Ancak, iki alternatif öneririm:

  1. Sadece 5 farklı sorgulamalar yapar. Eğer specifically, bir SQL sorgusunda bu bilgiyi (olası görünüyor), ihtiyaç olmadıkça, sadece DB 5 isteklerini yapmak ve daha sonra programlama bilgileri organize etmek çok daha basit olacak

  2. Tabloları katılmak kullanmak için DB yapısını düzeltmek. Ben bu sadece çünkü bu DB yapısı rastlamak gkimlikiyoruz sorunların herhangi bir sayıda ilk olduğunu bir tahmin tehlike olur.

Tabloları katılmak ederek, 2 ekstra masalarda bakıyoruz:

CREATE TABLE kod_tags {
  kod_kimlik INT,
  tag_kimlik INT
}

CREATE TABLE tags {
  kimlik INT,
  other fields
}

Bunun yerine kod tabloları tagX alanları kalmadan, etiket eklemek için katılmak tabloyu kullanın