• 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

VPS Starter Arubacloud
0 głosów
503 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,630 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,630 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,630 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ź 170 wizyt
pytanie zadane 13 stycznia 2020 w SQL, bazy danych przez reaktywny Nałogowiec (40,650 p.)
0 głosów
3 odpowiedzi 935 wizyt
pytanie zadane 23 stycznia 2018 w PHP przez hacker09 Użytkownik (520 p.)
0 głosów
0 odpowiedzi 122 wizyt
pytanie zadane 30 stycznia 2020 w SQL, bazy danych przez sapero Gaduła (4,100 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...