Resultaten uitsluiten in mysql query of while lus

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan H

stefan H

26/11/2013 13:58:40
Quote Anchor link
Kan iemand mij helpen met de onderstaande query,

het is de bedoeling dat hij alle resultaten ophaalt uit de database die aan de voorwaarde voldoen maar er moeten een aantal resultaten uit gesloten worden,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$searchQuery
= mysqli_query($connect,"SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, connections.userid, connections.friendid FROM members, connections
WHERE members.userid <> '"
.$_POST['userid']."' AND compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%'
ORDER BY rand()"
);
?>

alle resultaten doe ik echoen in een while lus,
het is de bedoeling dat hij van de table members de resultaten weglaat met de zelfde waarde als $_POST['userid']

op deze manier werkt het niet

hoop dat iemand mij kan helpen
alvst bedankt
 
PHP hulp

PHP hulp

25/11/2024 05:05:29
 
Kris Peeters

Kris Peeters

26/11/2013 14:46:54
Quote Anchor link
Operatoren hebben een volgorde. Die is niet per se van links naar rechts.
AND heeft voorang op OR.
Dus, als voorbeeld:

a=5 AND b=7 OR c=9
is het zelfde als
(a=5 AND b=7) OR (c=9)

Wat jij wil, is echter dit:
(a=5) AND (b=7 OR c=9)

Je moet dus eventueel haakjes zetten op de juiste plaats.

Voor jouw code betekent dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
" ... WHERE
  members.userid <> '"
.$_POST['userid']."'
  AND
  (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')"

?>
Gewijzigd op 26/11/2013 14:48:04 door Kris Peeters
 
Stefan H

stefan H

26/11/2013 15:43:29
Quote Anchor link
Bedankt voor je reactie alleen als ik dit zo aanpas dan werkt de hele query helemaal niet meer
 
Kris Peeters

Kris Peeters

26/11/2013 15:49:00
Quote Anchor link
Schrijf eens hoe de query er nu precies uitziet
 
Stefan H

stefan H

26/11/2013 15:53:30
Quote Anchor link
excuse had een tik foutje gemaakt deze werkt nu inderdaad, Bedankt,

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php


$searchQuery
= mysqli_query($connect,"SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, members.country, connections.userid, connections.friendid FROM members, connections
WHERE members.userid <> '"
.$_POST['userid']."' AND (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')
ORDER BY rand() LIMIT 0,1"
);
?>
 
Kris Peeters

Kris Peeters

26/11/2013 15:55:29
Quote Anchor link
graag gedaan
 
Stefan H

stefan H

26/11/2013 15:55:29
Quote Anchor link
nu zoek ik nog een manier om nog meer uitzonderingen te plaatsen,

uit een andere tabel komt resultaten met id nummers al deze id's moeten ook uitgezonderd worden kan ik deze ook in de query opnemen doormiddel van een array ofzo ?

hoop dat je hier ook mee kan helpen?

alvast bedankt
 
Kris Peeters

Kris Peeters

26/11/2013 16:00:25
Quote Anchor link
Dan maak je zo-iets aan:

WHERE (...) AND (...) AND (id NOT IN ( 250, 220, 170 ))

Waarbij die waarden de id's zijn van de records die je niet wil halen.
Lukt dat?


EDIT
Ik weet niet of dat veld effectief id heet. Moet je zelf uitzoeken
Gewijzigd op 26/11/2013 16:01:59 door Kris Peeters
 
Stefan H

stefan H

26/11/2013 16:12:35
Quote Anchor link
als ik onderstaande doe neemt hij alleen het eerste id mee die word gevonden met de andere query ,

hoe kan ik ervoor zorgen dat alle gevonden id's in een loop ofzo mee genomen worden ?

$searchQuery = mysqli_query($connect,"SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, members.country, connections.userid, connections.friendid FROM members, connections
WHERE (members.userid <> '".$_POST['userid']."') AND (members.userid NOT IN ('".$resultconnections['friendid']."')) AND (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')
ORDER BY rand() LIMIT 0,1");
 
Kris Peeters

Kris Peeters

26/11/2013 16:17:04
Quote Anchor link
Ja, op dat moment zou je een lijst aan id's moeten hebben.

$resultconnections['friendid'] is 1 id, juist?

Heb je die id's ergens in een array?
 
Stefan H

stefan H

26/11/2013 16:20:19
Quote Anchor link
dit is de query die de id's ( friendid ) ophaalt de lijst die hier uitkomt zou ook uitgesloten moeten worden hoe zit ik deze netjes in een array die ook in de andere query verwerkt kan worden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$selectconnections
= mysqli_query($connect,"SELECT userid,friendid FROM connections WHERE userid='".$_POST['userid']."'");

if($selectconnections == true){
(
$resultconnections = mysqli_fetch_array($selectconnections));

$uitgeslotenid = $resultconnections['friendid'];

}

?>
 
Kris Peeters

Kris Peeters

26/11/2013 16:29:53
Quote Anchor link
Probeer zo eens

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$res
= mysqli_query($connect, "SELECT userid, friendid FROM connections WHERE userid='" . $_POST['userid'] . "'");
$id_array = array();
while ($row = mysqli_fetch_array($res)) {
  $id_array[] = $row['friendid'];
}

// en nu een variabele klaar zetten voor in de SQL
$id_string = implode(',', $id_array);
...

 $searchQuery = mysqli_query($connect,"SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, members.country, connections.userid, connections.friendid FROM members, connections
WHERE (members.userid <> '"
.$_POST['userid']."') AND (members.userid NOT IN ($id_string)) AND (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')
ORDER BY rand() LIMIT 0,1"
);
?>



----

Trouwens ...
Het is altijd handig om - tijdens het schrijven van de code - de SQL string te printen.
Zo zie je of er fouten in zitten.
Je kan die print trouwens ook copy/pasten in phpMyadmin.

dus

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$sql
= "SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, members.country, connections.userid, connections.friendid FROM members, connections
WHERE (members.userid <> '"
.$_POST['userid']."') AND (members.userid NOT IN ($id_string)) AND (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')
ORDER BY rand() LIMIT 0,1"
;
$searchQuery = mysqli_query($connect, $sql);
echo $sql;
?>
Gewijzigd op 26/11/2013 16:33:41 door Kris Peeters
 
Stefan H

stefan H

26/11/2013 16:34:23
Quote Anchor link
super bedankt dit werkt geweldig

heb weer een hoop geleerd vandaag
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/11/2013 17:21:43
Quote Anchor link
Met alle respect, dit werkt wel, maar niet zoals jij denkt.
Voer deze query maar eens uit in phpMyAdmin maar dan zonder de limit.

Dit is namelijk een query met een CROSS JOIN, maar omdat je impliciet joined zie je dat niet.
 
Stefan H

stefan H

26/11/2013 17:24:46
Quote Anchor link
oke ger,

zou je mij misschien iets meer overkunnen vertellen wat er niet gaat , en hoe jij het op zou lossen ?

alvast bedankt
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/11/2013 17:58:34
Quote Anchor link
In jouw query staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
.... FROM members, connections

Hiermee impliceer je een join, als je dan in de WHERE nergens hebt staan waarop gejoined moet worden bv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
... WHERE members.user_id = connections.user_id

Dan krijg je dus een cross join.

Maar omdat je in de eerdere query al de friend_id bij een user ophaalt heb je die connections tabel in het geheel niet nodig.

Het kan overigens gewoon in één query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT
    m.user_id,
    m.first_name,
    m.last_name
FROM
    (
    SELECT
        friend_id
    FROM
        connections
    WHERE
        user_id = 1234
    ) c
RIGHT JOIN
    members m
    ON c.friend_id = m.user_id
WHERE
    c.friend_id IS NULL AND m.user_id <> 1234
 
Stefan H

stefan H

26/11/2013 18:02:59
Quote Anchor link
Ger,

Je heb gelijk dat de table connections niet nodig is in deze query, dit had ik inderdaad al voor mezelf aangepast,

ik ben er wel achter dat hij niet naar de zoek worden kijken alle resulaten worden weergegeven behalve dan die bij de uitzonderingen staan waar hierboven al over gesproken werd,

dit is mijn query nu ,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$searchQuery
= mysqli_query($connect,"SELECT members.userid AS memberuserid, members.fname, members.lname, members.proffesion, members.compname, members.compwebsite, members.compcity, members.profimage, members.country FROM members
WHERE (members.userid <> '"
.$_POST['userid']."') AND (members.userid NOT IN ($id_string)) AND (compname LIKE '%$searchCompname%' OR proffesion LIKE'%$searchProffesion%' OR compwebsite LIKE'%$searchCompwebsite%' OR compcity LIKE'%$searchCompcity%')
ORDER BY rand() LIMIT 0,1"
);
?>

heb je een idee waarom er niet naar de zoek woorden gekeken word ?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/11/2013 18:13:04
Quote Anchor link
Het lijkt erop dat je dan ergens een LIKE '%%' in je query krijgt, dus dat één van die variabelen leeg is.
Vandaar dat Kris je het advies gaf je query in een variabele te zetten, zodat je dit kan controleren
 
Stefan H

stefan H

26/11/2013 18:29:00
Quote Anchor link
Bedankt inderdaad een goeie tip stond inderdaad een leeg veld tussen
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

26/11/2013 19:14:52
Quote Anchor link
Slapen doen we 's nachts (of niet) ;-)

Je vroeg eerder hoe ik het zou doen, en ik zou het dus met één query doen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.