2016-06-27 4 views
0

Mysql Tabelle trennen: In My Anlage Tabelle ist dieseWie die Zeilenwert eins nach dem anderen mit Zählfunktion Option in mysql

 facility_name         mbid   date   
    yoga,aerobics,table tennis,tai chi,   OM1111   2016-06-12 
    aerobics,tai chi,        OM1111   2016-06-12 

Wie Zeilenwert eins nach dem anderen mit MBID in mysql aufzuspalten:

 Facility_name    mbid  Number of count 
     yoga     OM1111   1 
     aerobics     OM1111   2 
     table tennis    OM1111   1 
     tai chi     OM1111   2 
+2

Umstrukturieren Ihrer Datenbank, so dass es richtig normalisiert wird, und dies würde aufhören, ein Problem zu sein –

+0

Thaq zum Bearbeiten ... –

Antwort

1
CREATE TABLE facility 
    (facility_name varchar(35), mbid varchar(6), date varchar(10)) 
; 

INSERT INTO facility 
    (facility_name, mbid, date) 
VALUES 
    ('yoga,aerobics,table tennis,tai chi,', 'OM1111', '2016-06-12'), 
    ('aerobics,tai chi,', 'OM1111', '2016-06-12') 
; 

Script:

Select T.VALUE,T.mbid,COUNT(T.VALUE)Cnt FROM (
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.facility_name, ',', n.n), ',', -1) value,mbid 
    FROM facility t CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(t.facility_name) - LENGTH(REPLACE(t.facility_name, ',', ''))))T 
WHERE T.VALUE <> '' 
GROUP BY T.VALUE,T.mbid 
ORDER BY T.value 

Wie die Datumsfunktion zu übergeben, wo Zustand Anzahl der Aktivität zu erhalten:

Select facility.mbid,membership.name,membership.organization, 
membership.designation,membership.division, facility.VALUE `Facility Name`, 
COUNT(facility.VALUE)`Number of Activite` FROM (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(facility.facility_name, ',', n.n), ',', -1) value,mbid FROM facility CROSS JOIN 
(
    SELECT a.N + b.N * 10 + 1 n 
    FROM 
    (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
    ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
    ORDER BY n 
) n 
WHERE n.n <= 1 + (LENGTH(facility.facility_name) -LENGTH(REPLACE(facility.facility_name, ',', ''))))T 
facility Inner Join membership ON facility.mbid=membership.mbid 
where facility.date Between '2016-06-04' and '2016-06-07' && 
    facility.VALUE <> '' 
    GROUP BY facility.VALUE,facility.mbid ORDER BY facility.value 
+0

Ihre Beschwerde ist nett..als q .... –

+0

einfach die Tabelle ausführen und dieses Skript ausführen, erhalten Sie das gewünschte Ergebnis. Technisch habe ich Cross Join und LEN(), SUBSTRING verwendet, um das Komma getrennt zu trennen – mohan111

+0

Willkommen @VallavanJ – mohan111

0

Sie haben eine sehr schlechte Datenbankstruktur. Sie sollten eine Zeile pro mbid und facility_name haben. Tatsächlich habe ich keine Ahnung, warum mbid und date in den zwei Reihen gleich sind.

Wenn ich davon ausgehe, dass Sie Einrichtungsnamen in einer anderen Tabelle haben, verwenden Sie können dann:

select fn.facility_name, f.mbid, count(*) 
from facility f join 
    facility_names fn 
    on find_in_set(fn.facility_name, f.facility) > 0 
group by fn.facility_name, f.mbid; 

Ich sollte betonen aber, dass, obwohl Sie eine Abfrage wie dies tun können, müssen Sie wirklich Ihre beheben Datenstruktur. Das Speichern von Wertelisten in einer Zeichenfolge ist die falsche Methode zum Speichern von Daten in einer SQL-Datenbank.

+0

Ich habe Facility-Tabelle einen facility_name und mbid und wie kann ich die Value-Zeile wie unten angegeben teilen. –

Verwandte Themen