Hallo Allemaal,
Ik ben bezig met leren om queries samen te voegen,
Om site's net iets sneller te maken.
Tot zover gaat het goed,
dmv, fetch_assoc kan ik de 2 COUNTS tellen,
En alle users weer geven,
Maar zodra ik de maillist er tussen zette,
Kreeg ik een vreemd resultaat,
In users staan 48 waardes,
in maillist staan 141 waardes,
Iniden ik deze query uitvoer krijg ik 6768 resultaten, (48x141)
En dat is ook weer niet de bedoeling.
Weet iemand een oplossing?
En zou mij willen helpen? (duwtje in de goede richting?)
PHP Code:
SELECT u.user,
m.email, (
SELECT COUNT( 1 )
FROM users
) AS aantalusers, (
SELECT COUNT( 1 )
FROM maillist
) AS aantal1
FROM users u,
maillist m
- Queries Samenvoegen
-
12-02-2010, 20:16 #1Particulier
- Berichten
- 492
- Lid sinds
- 15 Jaar
Queries Samenvoegen
-
12-02-2010, 20:43 #2
- Berichten
- 256
- Lid sinds
- 14 Jaar
Misschien moet je eerst even vertellen wat je precies wilt bereiken. Ik moet zeggen dat ik de query zoals je 'm hierboven laat zien niet ken. Een SELECT binnen een SELECT heb ik nog niet gezien.
-
12-02-2010, 20:52 #3
- Berichten
- 330
- Lid sinds
- 17 Jaar
Een query binnen een andere query heet een subquery. Ik neem dat "1" refereert naar een kolom genaamd "1"?
En als je het gewoon zo doet:
PHP Code:SELECT u.user,
m.email, (
SELECT COUNT( * )
FROM users
) AS aantalusers, (
SELECT COUNT( * )
FROM maillist
) AS aantal1
FROM users AS u,
maillist AS m
-
12-02-2010, 20:56 #4
- Berichten
- 95
- Lid sinds
- 18 Jaar
Dan zou ik eerder denken aan:
PHP Code:SELECT DISTINCT(u.user),
m.email, (
SELECT COUNT( 1 )
FROM users
) AS aantalusers, (
SELECT COUNT( 1 )
FROM maillist
) AS aantal1
FROM users u,
maillist m
-
12-02-2010, 21:00 #5Particulier
- Berichten
- 492
- Lid sinds
- 15 Jaar
Nee de 1 staat voor elke rij die in de de tabel staat deze optelt.
Deze query heeft nog niet echt een bedoeling,
Meer om te oefenen van wat er mogelijk is,
Om van een bestaande script, een nieuwe versie te maken,
Waarbij alles iets meer geoptimaliseert is en een database class word gebruikt.
Waardoor de snelheid iets zal toenemen,
De eerste met een specifieke functie zou zijn
Controle van of user ingelogd is, SELECT
Controle of deze gebruiker niet verbannen is, (Count)
Kijken of gebruiker admin is,
Om te testen probeer ik 2x een count te doen. Aantal rijen in een 2 tabellen op te halen,
En bijv de users weergeven en de rijen in de tabel maillist weergeven,
Doormiddel van 1 query,
Of is er een andere manier om dit sneller te doen?
-
12-02-2010, 21:04 #6
- Berichten
- 330
- Lid sinds
- 17 Jaar
Een count uitvoeren of een lid verbannen is zie ik niet als nuttig. Wanneer je met statussen werkt dan heeft een verbannen lid een bepaalde status (bijvoorbeeld 3). In die query of in php (om een specifieke foutmelding te geven) kan je dan controleren of iemand deze status heeft en een melding laten tonen en de login van deze persoon annuleren.
Zover ik weet is een count uitvoeren op een hele tabel binnen een andere query niet echt zinvol, omdat dit telkens dezelfde uitkomsten geeft (of heb ik dat mis?).
-
12-02-2010, 21:09 #7Particulier
- Berichten
- 492
- Lid sinds
- 15 Jaar
Een count uitvoeren of een lid verbannen is zie ik niet als nuttig. Wanneer je met statussen werkt dan heeft een verbannen lid een bepaalde status (bijvoorbeeld 3). In die query of in php (om een specifieke foutmelding te geven) kan je dan controleren of iemand deze status heeft en een melding laten tonen en de login van deze persoon annuleren.
Zover ik weet is een count uitvoeren op een hele tabel binnen een andere query niet echt zinvol, omdat dit telkens dezelfde uitkomsten geeft (of heb ik dat mis?).
Met de status is een goed plan. Heb ik zo nog nooit overnagedacht,
Misschien heb je wel gelijk ja, Betreft die count,
Ik ga eens kijken wat sneller zou werken
-
12-02-2010, 21:10 #8
- Berichten
- 95
- Lid sinds
- 18 Jaar
Wat ik niet snap is waarom je een COUNT wilt gebruiken om te kijken of er een ban matched met een bepaalde persoon. Ik ga er dan vanuit dat jij 2 tabellen hebt:
users :: id, rank, nickname, tijd_ingelogd
bans :: user_id, banreden
Waarbij je dus wilt kijken of er een positief resultaat komt uit de COUNT van bans met WHERE user_id = id. Het zou hierbij makkelijker zijn om te kijken of je de rank van die gebruiker niet kunt aanpassen. Dat je bijvoorbeeld dit systeem hebt:
1 - Lid
2 - Groter Lid
3 - Nog groter Lid
4 - Moderator
5 - Admin
0 - Verbannen
Dan kun je eventueel een extra query uitvoeren om de ban reden op te halen. Als je het leuk wilt doen, kun je deze natuurlijk ook ophalen in de échte query. Dat is slechts een gevoelskwestie en als je niet een al te grote banlist verwacht, is die extra query natuurlijk gewoon een peulenschil en zal het weinig invloed maken op je performance.
Je query zou dan het volgende worden:
PHP Code:$query = mysql_query( "SELECT nickname, rank FROM users WHERE tijd_ingelogd > " . time() - 300" ) or die( mysql_error());
Edit: Hmm, naamgenoot was me al lang en breed voor ;)
-
12-02-2010, 21:11 #9
- Berichten
- 256
- Lid sinds
- 14 Jaar
-
12-02-2010, 21:21 #10
- Berichten
- 330
- Lid sinds
- 17 Jaar
Ja klopt, maar een gebruikelijke subquery in een select is wel om een count uit te voeren op een externe tabel (dus zoals de TS doet), echter heeft wat de TS doet weinig nut.
-
12-02-2010, 21:24 #11Particulier
- Berichten
- 492
- Lid sinds
- 15 Jaar
Klopt, De Count Heeft niet direct te maken met die tabellen,
Zoals ik het nu begrijp kan ik beter, de counts in een aparte Query zetten?
Aanvullend bericht:
Haha,
Had niet eens in de gaten dat er 2 Arjen's Waren,
Dan weet ik daarvoor genoeg,
Stel ik moet op een pagina meerdere dingen ophalen,
Bijv leden lijst, en een andere tabel,
En deze weergeven,
Hiervoor 2 aparte queries gebruiken?
Of is dit mogelijk in 1 en zou dat sneller zijn?Laatst aangepast door N. Meijer : 12-02-2010 om 21:32 Reden: Automatisch samengevoegd.
-
12-02-2010, 21:48 #12
- Berichten
- 95
- Lid sinds
- 18 Jaar
Als je grote lijsten moet ophalen, en bijvoorbeeld één count daarnaast dan moet je gebruik maken van 2 query's. Anders krijg je veel duplicatie in je resources.
-
12-02-2010, 21:49 #13
- Berichten
- 256
- Lid sinds
- 14 Jaar
Gewoon 2 aparte queries maken. Je kunt 'optimalisatie' ook te ver doordrijven. Je code moet logisch blijven natuurlijk.
Je kunt in één query natuurlijk zoveel tabellen uitvragen als je wilt, maar die 'moeten' dan wel een relatie hebben met elkaar.
@Arjan Rademaker: dat wist ik dan weer niet. Weet zo niet of ik daar een nuttige toepassing voor zou weten. Is het ook echt SQL standaard of Mysql specifiek?
-
12-02-2010, 21:51 #14
- Berichten
- 95
- Lid sinds
- 18 Jaar
(Ik antwoord even voor Arjen Rademaker)
Dat is gewoon een standaard SQL functie Ruud, is te gebruiken in (vrijwel?) alle SQL-varianten.
Plaats een
- + Advertentie
- + Onderwerp
Marktplaats
Webmasterforum
- Websites algemeen
- Sitechecks
- Marketing
- Domeinen algemeen
- Waardebepaling
- CMS
- Wordpress
- Joomla
- Magento
- Google algemeen
- SEO
- Analytics
- Adsense
- Adwords
- HTML / XHTML
- CSS
- Programmeren
- PHP
- Javascript
- JQuery
- MySQL
- Ondernemen algemeen
- Belastingen
- Juridisch
- Grafisch ontwerp
- Hosting Algemeen
- Hardware Info
- Offtopic