Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL] Meerdere tabellen

Pagina: 1
Acties:

  • DeX-nl
  • Registratie: April 2004
  • Laatst online: 23-11 15:43
Hallo,

ik ben bezig met een soort zoek programmatje te maken in php die zoekt op een aantal termen uit tabel A, die overeen moeten komen met de termen uit tabel B.

Op dit moment heb ik het nog vol uit geschreven in de php code:

code:
1
2
3
4
5
SELECT Title, Cat, SCat, Tags, Status, ID, Poster FROM TabelB WHERE

Title LIKE '%tussen de oren%' AND Cat LIKE '0' AND ID NOT LIKE '512718' AND ID NOT LIKE '523640' AND ID NOT LIKE '536524'
OR Title LIKE '%Black Books%' AND Cat LIKE '0'
OR Title LIKE '%Cone heads%' AND Cat LIKE '0'


In deze query zoek ik naar tussen de oren, black books en cone heads.

zodra 1 van deze termen over een komt met het continue geupdate database, zie ik dit terug op de web pagina. als er niets overeen komt, zie ik helemaal niets.

Deze manier van filteren in de database is erg lastig om bij te houden.

nu wil ik dus dat als ik een nieuwe zoekterm heb, dit kan invoegen in tabelA (tabel A is nog helemaal leeg nu) en dat hij dat automatisch daar ook op gaat filteren

Hoe moet ik dit doen? hoe maak ik deze sql code?

zou iemand me hier een zetje in de goede richting mee willen geven?

Alvast bedankt,

[ Voor 0% gewijzigd door DeX-nl op 31-03-2015 12:58 . Reden: Verwijderen van eigen naam ]


  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 25-11 00:51
Zoiets?

PHP:
1
2
3
4
5
6
7
8
9
10
11
$queryA = 'SELECT termen FROM TabelA WHERE [conditie];';
$termen = mysql_fetch_all($queryA);   // <- syntax klopt niet, ik gebruik laatste tijd pdo...
$queryTermen = '';
foreach( $termen as $term )
{
   if( !empty( $queryTermen) ) {
      $queryTermen .= ' OR ';
   }
   $queryTermen .= "Title LIKE '%" . $term . "%'";
}
$queryB = 'SELECT Title, Cat, SCat, Tags, Status, ID, Poster FROM TabelB WHERE '. $queryTermen . ' AND Cat=0 AND ID!=51235 AND [rest van condities];';

Syntaxfouten en escaping daargelaten. LIKE heb je niet nodig voor je categorie en id, dat is voor pattern matching bedoeld en niet voor exacte matches.

Heb je daar iets aan?

Ik weet niet of het helemaal in SQL kan, je zou dan een select op de termentabel moeten voeren aan de LIKE's van de zoekquery.

  • DeX-nl
  • Registratie: April 2004
  • Laatst online: 23-11 15:43
dankje maar ik wilde eigenlijk ook die ID's allemaal in een tabel hebben omdat het allemaal input's zijn die continue weer ID's als extra filters worden bij gedaan. ook de titel moet in de database komen waar op gezocht wordt.

code:
1
2
3
4
5
6
7
8
$sqlbeeld = "
SELECT TabelC.ban, TabelB.Title, TabelB.Cat, TabelB.SCat, TabelB.Tags, TabelB.Status, TabelB.ID, TabelB.Poster, TabelA.titel_ftdw FROM TabelC, TabelB, TabelA

WHERE TabelB.Title LIKE TabelA.titel_ftdw

AND TabelB.ID NOT LIKE TabelC.ban

LIMIT 250";


In TabelB staat de informatie die ik probeer te filteren (duizenden records)
in TabelA staan de titels die ik graag wil filteren uit tabelB
en in TabelC staan de ID's die ik NIET wil zien uit TabelB (soms komen er omdat er nogal veel records staan in tabelB, records naar voren die niet helemaal aan mijn omschrijving in tabelA voldoen)

nu zou je zeggen, et werkt... maar dat doet het niet. tot op zeker hoogte werkte het goed. het filteren werkt goed maar het NIET laten zien van de ID's in tabelC laat hij nu juist in plaats van "NOT LIKE" nu 9 keer zien! 8)7

Als ik maar 1 ID heb staan in TabelC laat hij die ID zoals het zou moeten horen, niet zien. zodra er meerdere ID's in die table heb staan, gaat hij ineens op hol slaan.

als ik "AND TabelB.ID NOT LIKE TabelC.ban" verander in "AND TabelB.ID LIKE TabelC.ban" met meerdere records in tabelC, laat hij alleen de records zien die aangegeven staan in tabelC (zoals het hoort).


Om een lang verhaal kort te maken; het lijkt wel alsof het niet mogelijk is om vanuit een table met NOT LIKE te werken. Alleen met LIKE.

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 25-11 00:51
SQL:
1
2
3
4
5
6
7
8
SELECT DISTINCT B.id
FROM 
(TabelA AS A
INNER JOIN TabelB AS B
ON B.Title LIKE A.Title)
LEFT JOIN TabelC AS C
ON C.ban=B.id
WHERE C.id IS NULL;


Ik zou zoiets doen. Weet niet of het werkt. Idee is dat de LEFT JOIN de resultaten van TabelB pakt maar via de WHERE die resultaten uitsluit die ook in TabelC voorkomen.

Verder zou ik LIKE en NOT LIKE niet gebruiken om direct een veld 1 op 1 te vergelijken, dat is meer bedoeld om delen van een veld op te zoeken.

  • DeX-nl
  • Registratie: April 2004
  • Laatst online: 23-11 15:43
oke...zo met sql werken heb ik eerlijk gezegd nog nooit gedaan. dankje! ik zal es gaan onderzoeken hoe precies te werken met dat JOIN en AS enzo.

EDIT: heb em nu helemaal herschreven (zodat ik het zelf ook kan) en dit is het (tot nu toe) geworden:
code:
1
2
3
4
5
6
7
8
SELECT DISTINCT Title, ID, Poster FROM TabelB

INNER JOIN TabelA
ON TabelB.Title LIKE TabelS.titel_ftdw

LEFT JOIN TabelC
ON TabelB.ID = TabelC.ban
WHERE TabelC.ban IS NULL AND TabelA.Cat_ftdw LIKE 'overige'


Zonder haakjes en "AS".

Bedankt voor je goede hulp! _/-\o_

[ Voor 58% gewijzigd door DeX-nl op 19-11-2007 15:04 ]


  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 25-11 00:51
Graag gedaan. Tof dat je er zelf in duikt, dat is de manier om het te begrijpen.
Pagina: 1