• 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

0 głosów
131 wizyt
pytanie zadane 16 sierpnia 2017 w SQL, bazy danych przez Q_Nick Gaduła (4,940 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,720 p.)
pokaż kod i strukturę bo ciężko coś z tego zrozumiec.
2
komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 p.)
Kod nie ważny bo trzeba napisać od nowa

3 odpowiedzi

0 głosów
odpowiedź 16 sierpnia 2017 przez Ehlert Mędrzec (165,060 p.)
Masz relację firmy⇔rangi, czyli wiele do wielu. Potrzebujesz 3 tabel.
komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 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 Mędrzec (165,060 p.)
Musisz mi pokazać strukturę tabel.
komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 p.)

Struktura tabeli w phpmyadmin

komentarz 16 sierpnia 2017 przez Ehlert Mędrzec (165,060 p.)
Chłopie daj eksport ze schematu tabeli do .sql bo nic nie widać.
komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 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 (25,120 p.)

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

więcej informacji

M.

komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 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 (25,120 p.)
Relacji nie da się ustawiać? To jest jakiś NoSQL silnik?

M.
komentarz 16 sierpnia 2017 przez Q_Nick Gaduła (4,940 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,840 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
3 odpowiedzi 248 wizyt
pytanie zadane 23 stycznia 2018 w PHP, Symfony, Zend przez hacker09 Użytkownik (520 p.)
+1 głos
1 odpowiedź 361 wizyt
pytanie zadane 20 września 2016 w SQL, bazy danych przez Trucik Obywatel (1,180 p.)
0 głosów
2 odpowiedzi 387 wizyt
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.Podgląd posta

64,243 zapytań

110,635 odpowiedzi

231,941 komentarzy

46,992 pasjonatów

Przeglądających: 273
Pasjonatów: 8 Gości: 265

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...