• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SQL sprawdzanie czy dana liczba jest w bazie

Object Storage Arubacloud
0 głosów
518 wizyt
pytanie zadane 16 sierpnia 2017 w SQL, bazy danych przez Q_Nick Mądrala (5,010 p.)
Robię system rang w systemie z którego ma korzystać niezależnie od siebie wiele grup użytkowników. Mam tabelę ranks. Zawiera ona id rangi, poziom rangi, nazwę rangi i firmę do której należy. I problem pojawia się gdy chcę zrobić listę NIE używanych rang w danej firmie. Zrobiłem to w formie pętli wypisującej od 1 do 10 i przy każdej liczbie sprawdzającej czy jest taka liczba w polu z poziomem tylko nie jest to zbyt wydajne. Jakieś pomysły jak zrobić to jakoś w miarę sensownie?
komentarz 16 sierpnia 2017 przez Boshi VIP (100,240 p.)
pokaż kod i strukturę bo ciężko coś z tego zrozumiec.
2
komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)
Kod nie ważny bo trzeba napisać od nowa

3 odpowiedzi

0 głosów
odpowiedź 16 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Masz relację firmy⇔rangi, czyli wiele do wielu. Potrzebujesz 3 tabel.
komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)
To wiem, chodzi jak zrobić kod, który wypisze mi tylko używane rangi.

Przykładowo używam rangi z poziomem 3 (w całym systemie są rangi od 0 do 9), więc kod ma mi wypisać rangi 0, 1, 2, 4, 5, 6, 7, 8, 9. I tylko tyle :P
komentarz 16 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Musisz mi pokazać strukturę tabel.
komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)

Struktura tabeli w phpmyadmin

komentarz 16 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Chłopie daj eksport ze schematu tabeli do .sql bo nic nie widać.
komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)
Proszę bardzo

CREATE TABLE `ranks` (
  `rank_id` int(5) NOT NULL,
  `rank_name` varchar(30) NOT NULL,
  `rank_wage` float NOT NULL,
  `rank_corpo` int(5) NOT NULL,
  `rank_level` int(5) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `ranks`
  ADD PRIMARY KEY (`rank_id`);

ALTER TABLE `ranks`
  MODIFY `rank_id` int(5) NOT NULL AUTO_INCREMENT;

 

0 głosów
odpowiedź 16 sierpnia 2017 przez maciej.tokarz Nałogowiec (27,280 p.)

Można na różne sposoby to realizować. Na przykład...

więcej informacji

M.

komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)

Nie zrozumieliśmy się. Dodaje kod, to może on wyjaśni sobą to czego ja nie potrafię.

 

<?php
                                
                                $corpo=$_SESSION['corpo'];
                                        
                                for($i=0; $i<=9; $i++)
                                {
                                    $result=mysqli_query($mysqli, "SELECT * FROM ranks WHERE rank_id='$i' WHERE corpo='$corpo'") or die('blad zapytania');

                                    if(mysqli_num_rows($result)==0)
                                    {
                                        echo '<option>'.$i.'</option>';
                                    }

                                    mysqli_free_result($result);
                                }
                            ?>

Jest to mój kod, który działa, ale jest (przypuszczam) niezbyt wydajny, bo wykonuje aż 10 zapytań do bazy danych, a chcę aby wykonywało się tylko raz.

komentarz 16 sierpnia 2017 przez maciej.tokarz Nałogowiec (27,280 p.)
Relacji nie da się ustawiać? To jest jakiś NoSQL silnik?

M.
komentarz 16 sierpnia 2017 przez Q_Nick Mądrala (5,010 p.)
da się, tylko relacja do tej tabeli jest w tabeli users i to jest jedyna relacja z tą tabelą
0 głosów
odpowiedź 16 sierpnia 2017 przez jeremus Maniak (59,720 p.)

naprościej by było utworzy  tabelę - listę rang np: list_rang  ( w niej by było np. pole rang )

wiersze tabeli zawierałyby wartości od o do 9

zapytanie wyglądałoby wtedy tak :

select rang from list_rang where rang not in ( select rank_id from ranks where ....-- warunek na corpo) 

 

ma to tę zaletę  że uniezależnisz się od ilości rank - a nuż będzie ich 20 a nie 10 - wtedy dopisujesz je tylko do tabeli list_rang - a zapytanie się nie zmienia

W MSSQL można skorzystać także z takiej tabeli tworzonej ad hock ( nie wiem jak jest w mysql)

tutaj masz opis  ;

https://stackoverflow.com/questions/9113204/t-sql-how-to-select-values-in-value-list-that-are-not-in-the-table

 

Podobne pytania

0 głosów
1 odpowiedź 171 wizyt
pytanie zadane 13 stycznia 2020 w SQL, bazy danych przez reaktywny Nałogowiec (40,930 p.)
0 głosów
3 odpowiedzi 942 wizyt
pytanie zadane 23 stycznia 2018 w PHP przez hacker09 Użytkownik (520 p.)
0 głosów
0 odpowiedzi 124 wizyt
pytanie zadane 30 stycznia 2020 w SQL, bazy danych przez sapero Gaduła (4,100 p.)

92,539 zapytań

141,382 odpowiedzi

319,480 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...