Nawiązane relacji z dwoma tabelami

0

Mam tabelę 2 o nazwie:

category
id | category_name
1 | Example category
cms
id | id_category | subject | description
1 | 1 | Example subject | Example description

Chcę nawiązać relację między tymi dwoma tabelkami.

Fragment zapytania:

SELECT `subject` FROM `cms` WHERE

i nie wiem co dać w WHERE. Już tłumaczę o co mi chodzi.
Chodzi o to, żeby to zapytanie pobierało dane tylko wtedy jeśli cyfra/liczba z kolumny id w tabelce category będzie taka sama jak cyfra/liczba z kolumny id_category z tabelki cms

Proszę o pomoc w tej sprawie.
Pozdrawiam.

0

Próbuję też takim zapytaniem, lecz to pobiera wszystkie możliwe dla wszystkich kategorii.

SELECT `subject`, category.id FROM forum, category WHERE forum.id_category = category.id
0

LEFT JOIN/INNER JOIN
Btw, cyfra to nie to samo co liczba i nie mogą być używane jako synonimy.

0

Nie bardzo rozumiem zastosowanie LEFT JOIN/INNER JOIN dla tego konkretnego przykładu. Możesz rozwinąć to o jakiś przykład?

Nie utożsamiam liczb z cyfrą. Podałem "cyfra/liczba", ponieważ id ma wartość AUTO_INCREMENT i w późniejszym czasie może dojść z 1 do np. 15 i to jest już liczbą.

0

(...) i w późniejszym czasie może dojść z 1 do np. 15 i to jest już liczbą.

Ktoś tutaj nie uważał na lekcjach matematyki - poczytaj co to cyfra, a czym jest liczba ;)

Możesz rozwinąć to o jakiś przykład?

O ile dobrze rozumiem, co próbujesz osiągnąć:

SELECT
	*
	
FROM
	`cms` cms
	
LEFT JOIN
	`category` cat USING (`id_category`)
0

To nie o to chodzi. Powyższe zapytanie jest trochę bez sensu gdyż nic nie zwraca.
Prezentuję screen jak to wygląda.
list.png

Wyświetlam to wszystko w liście.
Aktualne zapytanie:

SELECT `subject`, category.id FROM cms, category WHERE cms.id_category = category.id

Jak widać na powyższym screenie wszystkie 4 "tematy" wyświetlane są dla każdej z kategorii, bez znaczenia ile ich będzie.
Chodzi o przyporządkowanie dla konkretnej kategorii konkretnego tematu. Wie ktoś jak to rozgryźć?

Co do liczb...? cyfr...? yy.. no tych numerków :D to nie ma co dogadywać... cyfry są od -9 do 9, natomiast liczby powyżej tego. Tak mnie uczono, chyba, że jest inaczej...?

0

Źle Cię uczono. 3 jest liczbą, '3' jest cyfrą. W terminach programowania: liczby są typów numerycznych (int, float, double, long,..), cyfry są typu char.

0

Powyższe zapytanie jest trochę bez sensu gdyż nic nie zwraca.

Niby w jaki sposób nic nie zwraca? :|

Chodzi o przyporządkowanie dla konkretnej kategorii konkretnego tematu. Wie ktoś jak to rozgryźć?

No wykorzystując left join...

to nie ma co dogadywać... cyfry są od -9 do 9, natomiast liczby powyżej tego

Tu nie chodzi o dogadywanie się, a o formalne definicje.
Cyfra nie ma wartości, a liczba ma.
Różnica taka jak między literą, a wyrazem - litera buduje wyraz, ale sama nim nie jest.

0

Twoje zapytanie powoduje taki efekt:

list2.png

Więc albo ono nie działa albo ja coś źle zrobiłem. Być może chodzi o to "cat". Jaką ono pełni tu rolę i co to jest?

//Co za różnica jeśli powiem, że 1 jest liczbą czy cyfrą, skoro podałeś 1 jako liczbę cyfrę? Ale dobrze wiedzieć na przszłość, bo akurat tego nie wiedziałem.

0

Pokaż kod widoku.

Co za różnica jeśli powiem, że 1 jest liczbą czy cyfrą, skoro podałeś 1 jako liczbę cyfrę?

Chodzi o matematyczną poprawność - cyfra nie ma wartości, bo jest tylko znakiem, a liczba ma wartość.

0
echo '
<li>
<select name="newTopic">
<option selected="selected" disabled="disabled">Create new topic in...</option>
';
foreach($category->getCategory() as $row){
	echo '<optgroup label="'.$row['category_name'].'">';
	foreach($cmsName->getCms() as $row){
		echo '<option>'.$row['subject'].'</option>';
	}
	echo '/optgroup';
}
echo '</select>
</li>
';

A zapytanie z modelu:

SELECT * FROM `cms` cmsLEFT JOIN `category` cat USING (`id_category`)

Może to coś pomoże?

0
echo '
<li>
<select name="newTopic">
<option selected="selected" disabled="disabled">Create new topic in...</option>
';
foreach($category->getCategory() as $row){
    echo '<optgroup label="'.$row['category_name'].'">';
    foreach($cmsName->getCms() as $row){
        echo '<option>'.$row['subject'].'</option>';
    }
    echo '</optgroup>';
}
echo '</select>
</li>
';
SELECT * FROM `cms` cms LEFT JOIN `category` cat USING (`id_category`)

Drobne literówki ale nie one powodują problem.

0
echo '
<li>
<select name="newTopic">
<option selected="selected" disabled="disabled">Create new topic in...</option>
';
foreach($category->getCategory() as $row){
    echo '<optgroup label="'.$row['category_name'].'">';
    foreach($cmsName->getCmsForCategory($row['category_id']) as $row){
        echo '<option>'.$row['subject'].'</option>';
    }
    echo '</optgroup>';
}
echo '</select>
</li>
';

Z zapytaniem SELECT subject FROM cms WHERE id_category = ..., gdzie te trzy kropeczki to parametr metody getCmsForCategory.

Btw, dlaczego nazwałeś tabelę i metody cms? To niesamowicie mylące, bo sugeruje, że masz wiele różnych cmsów podpiętych pod różne kategorie (?), co wyraźnie daje do zrozumienia, że operujesz na lewo i prawo pojęciem cms, które nie do końca rozumiesz.

0

po pierwsze dajesz dane wejściowe oraz dane wyjściowe jakie chcesz uzyskać. Gdybanie nad zapytaniem jeśli nie wiadomo na jakich danych będą działać jest bez sensu

0

Daremny Wasz trud, Panowie!
Nie jest możliwe, aby ktoś, kto nie odróżnia cyfr od liczb mógł programować ze zrozumieniem. Odpowiadając mu tracicie tylko czas.

0

Ty some coś tam jak nie masz nic mądrego do powiedzenia to się nie wtrącaj! Gwarantuję Ci, że znalazłbym niejedną banalną rzecz, której nie wiesz i wtedy ja bym mógł mówić o tobie, że nie nadajesz się do programowania z rozumieniem! Ja w przeciwieństwie do Ciebie potrafię przyznać się do czegoś czego nie wiem i otwarcie mówić o swoich brakach. Nie wiem jakim cudem jesteś moderatorem skoro sam łamiesz kilka podstawowych zasad pisząc w ten sposób. A poza tym jest to wysoce niegrzeczne, wtrącać się do rozmowy z pyskówkami... na lekcjach w przedszkolu nie uważałeś?

Co do problemu: Patryk27(bo jako jedyny wypowiadasz się mądrze na tym forum, dosadnie ale nie wrednie jak to o niektórzy...)
Wiem nazywam niektóre zmienne dość chaotycznie ale to ze względu, że dużo rzeczy chcę zrobić za jednym razem i mi się myli. Poprawiłem na lepsze zmienne jak proponowałeś jednakże problem nie zniknął. Nadal Twoje zapytanie powoduje taki sam efekt.

0

Wrzuć aktualny kod.

0

Kod jest praktyczne taki sam jednakże dokonałem kilku poprawek zmiennych. Nie używam już wyrazu cms tylko oznaczyłem to jako forum, gdyż to jest pewna forma mini forum. Mniejsza o to.

Kod:

echo '
<li>
<select name="newTopic">
<option selected="selected" disabled="disabled">Create new topic in...</option>
';
foreach($category->getCategory() as $row){
	echo '<optgroup label="'.$row['category_name'].'">';
	foreach($forumName->getForum() as $row){
		echo '<option>'.$row['subject'].'</option>';
	}
	echo '</optgroup>';
}
echo '</select>
</li>
';

Metoda pobierająca kategorię:

public function getCategory(){
	$rowCategory = $this->dbHandler->prepare("SELECT * FROM `category`");
	if($rowCategory->execute() == false){
		print_r($rowCategory->errorInfo());
		return false;
		}else{
		return $rowCategory->fetchAll(PDO::FETCH_ASSOC);
	}
	return true;
}
}

Metoda pobierająca fora w kategorii:

public function getForum(){
	$rowForum = $this->dbHandler->prepare("SELECT `subject`, category.id FROM category, forum WHERE category.id = forum.id_category");
	if($rowForum->execute() == false){
		print_r($rowForum->errorInfo());
		return false;
		}else{
		return $rowForum->fetchAll(PDO::FETCH_ASSOC);
	}
	return true;
}

Be zbędnych komentarzy proszę, żadnych mitów tylko fakty...

0

Dodatkowo powie, ze chodzi o utworzenie relacji "wiele do jednego".

0

Spojrzałem, jednakże edytowałeś w nim linijkę wcześniejszą na tą:

foreach($cmsName->getCmsForCategory($row['category_id']) as $row){

co powoduje u mnie nie tyle błąd, bo nie błąd tylko nie wyświetla się po prostu strona, pusto. Pojawia się tylko ten select z dwoma grupami, też pusty.

Nie bardzo rozumiem też co za parametr po tych "kropeczkach" ma być.

0

Trochę wyobraźni :P

Musisz pobrać listę forów dla danej kategorii, lecz baza przecież nie potrafi czytać ze szklanej kuli, zatem w tym Twoim kodzie:

foreach($category->getCategory() as $row){
    foreach($forumName->getForum() as $row){

Skąd ona ma wiedzieć, że chcesz pobrać fora dla aktualnej kategorii zawartej w $row?

Rozwiązanie to:

foreach($category->getCategory() as $row){
    foreach($forumName->getForumsForCategory($row['id_kategorii']) as $row){

Tworzysz metodę getForumsForCategory($categoryId), która wywołuje zapytanie SELECT subject FROM cms WHERE id_category = $categoryId i voilà.

PS metoda zwracająca listę kategorii powinna nazywać się getCategories, a nie getCategory.

0
Pijany Kaczor napisał(a):

Gwarantuję Ci, że znalazłbym niejedną banalną rzecz, której nie wiesz i wtedy ja bym mógł mówić o tobie, że nie nadajesz się do programowania z rozumieniem!

Zachęcam zatem do poszukiwań.

To nie jest banalna rzecz tylko absolutnie podstawowa wiedza. Tak bardzo podstawowa, że uczy się jej w pierwszej klasie szkoły podstawowej. Ja rozumiem, że murarz, kucharz czy robotnik taśmowy może tego nie wiedzieć - bo może jakimś cudem jest mu to niepotrzebne w życiu, ale ktoś, kto zajmuje się programowaniem?! Przecież w tej branży na co dzień operuje się na czterech systemach liczbowych, które mają różne zestawy cyfr, niekiedy nawet 16. Zdajesz sobie w ogóle sprawę, że A czy F też może być cyfrą?

Ale skoro jesteś otwarty na wiedzę, to wiedz też, że relacja i tabela to dokładnie to samo, a Twój tytuł wątku nie ma sensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1