Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ Zliczanie pustych komórek

Napisany przez: djavid 7.11.2019, 08:19:59

Drodzy forumowicze

Mam spory problem z zapytaniem. Przeszukałem chyba wszystko i nie widzę rozwiązania.

Mam taką oto przykładową tabelę:

Id | Cat | Title | Area | Fence | Number | Status

1 | 2 | Tytuł | empty | empty | 12/2019 | 1

To tylko wycinek oczywiście, każdy wiersz tabeli zawiera około 50 kolumn z czego około 20 nie jest obowiązkowych.

Pracownicy często nie uzupełnią wszystkich danych. Można zrobić walidację po stronie formularza ale nie wszystkie pola są obowiązkowe. Mimo wszystko, że nie są obowiązkowe to chciałbym informację ile komórek w danym rekordzie jest pustych (== empty).
Dla powyższego przykładu wynik powinien być = 2.

Napisany przez: trueblue 7.11.2019, 09:35:05

  1. SELECT Area='' + Fence='' + ..... FROM tabela

Tu akurat jest porównanie z pusty ciągiem. Nie wiem czym u Ciebie jest pusta komórka, czy pustym ciągiem, czy też wartością NULL, a być może obydwiemia.

Napisany przez: djavid 7.11.2019, 12:44:54

Nie wiem jak by to miało działać ale co bym nie podstawił otrzymuje w odpowiedzi "1". Pomijając że nie działa to musiałbym podstawić ponad 20 komórek do zapytanie
MySQL nie oferuje prostszego sposobu na sprawdzenie czy np. w wierszu o id = 1 występują puste komórki?

Napisany przez: trueblue 7.11.2019, 12:47:23

Miałoby działać tak, że powinieneś określić czym jest u Ciebie wartość pusta. Chyba, że to jakaś tajemnica. Bo jeśli wartość pusta to NULL, to należy użyć innego porównania, co sugerowałem w innym poście.

Nie, MySQL nie oferuje innej możliwości. Zamęczyłeś MySQL taką strukturą tabeli, więc i on nie ułatwia Ci innego rozwiązaniu problemu.

Napisany przez: djavid 7.11.2019, 13:31:47

Cytat(trueblue @ 7.11.2019, 13:47:23 ) *
Miałoby działać tak, że powinieneś określić czym jest u Ciebie wartość pusta. Chyba, że to jakaś tajemnica.


Napisałem w dwóch miejscach, że w moim przypadku jest to wartość "empty". Podstawiam taką wartość i za każdym razem otrzymuję wynik "1"

Cytat(trueblue @ 7.11.2019, 13:47:23 ) *
Zamęczyłeś MySQL taką strukturą tabeli, więc i on nie ułatwia Ci innego rozwiązaniu problemu.


Zamęczyłem? Tabela składająca się z 45 kolumn to zajechanie MySQL? Pierwsze słyszę. Są to rozbudowane formularze a nie tabela z artykułami czy galeria zdjęć gdzie zamknęlibyśmy się pewnie w 20 kolumnach.

Szkoda, że nie ma prostszego rozwiązania. Potrzebowałem tego dla celów informacyjnych aby szybko podejrzeć jaka część danego formularza jest wypełniona. Bez problemu można by wygenerować informację w jakim procencie został wypełniony dany wniosek (100% danych, 40%). Obecnie muszę otwierać każdy formularz i sprawdzać jaka część danych jest wypełniona.


Napisany przez: trueblue 7.11.2019, 14:29:27

Nie zajechałeś, "zamęczyłeś" strukturą. Sam widzisz tego skutki. Być może dałoby się rozbić tabelę na dwie, np. tabelę główną i tabele cech.

Skoro wartość to "empty" to nie wystarczy zmienić warunku na ='empty'?

Jaki w ogóle jest sens wstawiania wartości "empty", skoro masz dostępną wartość NULL?

Możesz zapisywać wypełnienie podczas zapisu rekordu do bazy (zliczyć w skrypcie i wstawić wartość liczbową w odrębną kolumnę).

Napisany przez: djavid 7.11.2019, 15:00:18

Cytat(trueblue @ 7.11.2019, 14:29:27 ) *
Być może dałoby się rozbić tabelę na dwie, np. tabelę główną i tabele cech.


Można ale nic by to nie dało. Wtedy musiałbym się odwoływać do 2 tabel z tym samym zapytaniem.

Cytat(trueblue @ 7.11.2019, 14:29:27 ) *
Skoro wartość to "empty" to nie wystarczy zmienić warunku na ='empty'?


Dla mnie nie ma znaczenia czy warunek będzie = 'empty' czy będzie = ''. Zliczenie wierszy gdzie komórka jest równa czemuś nie stanowi problemu. Pytanie jak zliczyć ilość komórek w wierszu które są równe "empty" lub są puste ""

Cytat(trueblue @ 7.11.2019, 14:29:27 ) *
Możesz zapisywać wypełnienie podczas zapisu rekordu do bazy (zliczyć w skrypcie i wstawić wartość liczbową w odrębną kolumnę).


Chyba tak będzie najszybciej ale nie lepiej. Myślałem, że da się takie warunki zrobić po stronie MySQL bez nadmiernego klepania dziesiątek linijek "if" w PHP. Poza tym na etapie projektowanie bazy nie przypuszczałem, że taka funkcja się przyda.



Napisany przez: nospor 7.11.2019, 15:47:35

Cytat
. Pytanie jak zliczyć ilość komórek w wierszu które są równe "empty" lub są puste ""

Lekko poprawione zapytanie, bo tamto pierwsze moze zwracac zle wyniki

select IF(pole1 = '' ,1,0) + IF(pole2 = '' ,1,0) FROM tabela
I to zapytanie dziala - sprawdzone.
Jak ci nie dziala to pewnie zle odbierasz dane z zapytania, pewnie w php?
Co do dwoch tabel to nie zrozumiales zamyslu przedmowcy, ale co tam. Niech on tlumaczy wink.gif

swoja droga faktycznie poroniony pomysl by wstawiac w komorke tekst 'empty' gdy ta jest pusta.... Ale co ja sie dziwie, juz widzialem twory jak slash i backslash ( \/ ) wstawiane w tresc komorki, tylko po to by wygladalo podobnie jak zaznaczenie w formularzu... Ludzie to maja "pomysly"

Napisany przez: trueblue 7.11.2019, 16:09:17

Cytat(djavid @ 7.11.2019, 15:00:18 ) *
Dla mnie nie ma znaczenia czy warunek będzie = 'empty' czy będzie = ''. Zliczenie wierszy gdzie komórka jest równa czemuś nie stanowi problemu. Pytanie jak zliczyć ilość komórek w wierszu które są równe "empty" lub są puste ""



  1. SELECT Area='empty' + Fence='empty' + ..... FROM tabela


A skoro "empty" i "", to:

  1. SELECT (Area='empty' OR Area='') + (Fence='empty' OR Fence='') + ..... FROM tabela



Ciekaw jestem co zrobisz kiedy faktycznie jakaś wartość pola będzie musiała przyjąć wartość "empty" i to nie będzie "empty" w Twoim rozumieniu.


Napisany przez: nospor 7.11.2019, 16:23:35

@trueblue nawet jak sprawdzasz tylko jeden warunek, to wszystko ma byc w nawiasach, w przeciwnym wypadku beda albo 0 albo 1 zawsze

SELECT (Area='empty') + (Fence='empty') + (.....) FROM tabela

Napisany przez: trueblue 7.11.2019, 16:31:34

nospor, tak, masz rację.

Napisany przez: nospor 7.11.2019, 16:33:44

No i zabawie z NULLami, wynikiem moze byc NULL a nie liczba. Temu wlasnie podalem wczesniej zapytanie z IF, ktore jest odporne na NULLe

Napisany przez: trueblue 7.11.2019, 16:45:31

W takim przypadku użyłbym COALESCE(pole,'')='', a jeśli z "empty", to (COALESCE(pole,'')='' OR pole='empty').

Tyle, że autor chyba nie używa NULL.

Napisany przez: djavid 8.11.2019, 12:59:39

  1. SELECT IF(offer_plottype = 'empty' OR offer_plottype = '', 1, 0) + IF(offer_fence = 'empty' OR offer_fence = '', 1, 0)

Działa, dziękuję Wam obu. Co do "empty" to występuje tylko dlatego że jest jedna tabela składająca się z około 40 komórek przy czym jest kilka formularzy i nie każdy pokrywa się w 100% z polami. Jeden wykorzystuje wszystkie, inny tylko 38 inny też 38 ale trochę innych. Żeby nie robić kilku tabel pokrywających się w 98% zdecydowałem się na takie rozwiązanie. Kiedy komórka jest pusta wiadomo, że nie dotyczy jeżeli empty to znaczy, że nie wypełniono przy czym są to listy wyboru więc nie ma możliwości aby pojawiła się fraza empty a nie oznaczała empty smile.gif Tak łopatologicznie w skrócie.

Dziękuję, człowiek uczy się całe życie. Być może są lepsze rozwiązania ale projekt nie jest na potrzeby komercyjne więc nie musi wyglądać jak by projektował go profesjonalista. Nie uważam się też za kogoś kto by zjadł zęby na MySQL więc za cenne uwagi dziękuję, za krytykę nie smile.gif

Napisany przez: trueblue 8.11.2019, 13:10:12

  1. SELECT (offer_plottype = 'empty' OR offer_plottype = '') + (offer_fence = 'empty' OR offer_fence = '') ...

Nie są potrzebne IF.

Napisany przez: nospor 8.11.2019, 15:02:03

Cytat
za krytykę nie
Konstruktywna krytyka to tez czesto cenna uwaga smile.gif Szczegolnie od nas wink.gif

Cytat
Kiedy komórka jest pusta wiadomo, że nie dotyczy jeżeli empty to znaczy, że nie wypełniono przy czym są to listy wyboru więc nie ma możliwości aby pojawiła się fraza empty a nie oznaczała empty
Dlatego wlasnie miedzy innymi wymyslono NULL a nie jakies teksty 'empty' wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)