Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zliczanie pustych komórek
djavid
post 7.11.2019, 08:19:59
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.10.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 09:35:05
Post #2





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  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.


--------------------
Go to the top of the page
+Quote Post
djavid
post 7.11.2019, 12:44:54
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.10.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 12:47:23
Post #4





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
djavid
post 7.11.2019, 13:31:47
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.10.2009

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 14:29:27
Post #6





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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ę).

Ten post edytował trueblue 7.11.2019, 14:31:42


--------------------
Go to the top of the page
+Quote Post
djavid
post 7.11.2019, 15:00:18
Post #7





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.10.2009

Ostrzeżenie: (0%)
-----


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.


Go to the top of the page
+Quote Post
nospor
post 7.11.2019, 15:47:35
Post #8





Grupa: Moderatorzy
Postów: 34 867
Pomógł: 5802
Dołączył: 27.12.2004




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"


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 16:09:17
Post #9





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.



--------------------
Go to the top of the page
+Quote Post
nospor
post 7.11.2019, 16:23:35
Post #10





Grupa: Moderatorzy
Postów: 34 867
Pomógł: 5802
Dołączył: 27.12.2004




@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


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 16:31:34
Post #11





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


nospor, tak, masz rację.


--------------------
Go to the top of the page
+Quote Post
nospor
post 7.11.2019, 16:33:44
Post #12





Grupa: Moderatorzy
Postów: 34 867
Pomógł: 5802
Dołączył: 27.12.2004




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


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
trueblue
post 7.11.2019, 16:45:31
Post #13





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post
djavid
post 8.11.2019, 12:59:39
Post #14





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 11.10.2009

Ostrzeżenie: (0%)
-----


  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

Ten post edytował djavid 8.11.2019, 13:00:47
Go to the top of the page
+Quote Post
trueblue
post 8.11.2019, 13:10:12
Post #15





Grupa: Zarejestrowani
Postów: 5 600
Pomógł: 1524
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


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

Nie są potrzebne IF.


--------------------
Go to the top of the page
+Quote Post
nospor
post 8.11.2019, 15:02:03
Post #16





Grupa: Moderatorzy
Postów: 34 867
Pomógł: 5802
Dołączył: 27.12.2004




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


--------------------

Najlepsze kawałki programistyczne || Dowcipy o informatykach || Forum PHP dla opornych
Klasy: Pager (stronicowanie) | Cache | ShoutBox (Chat) | Widok | Ładne url'e

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.12.2019 - 14:41