[MySQL] Welke Query ?

Pagina: 1
Acties:

  • P.B.
  • Registratie: Juli 2001
  • Niet online
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
# Tabel structuur voor tabel `GP_LE_Stats`
#

CREATE TABLE GP_LE_Stats (
  IP varchar(15) NOT NULL default '',
  LE_ID int(10) NOT NULL default '0'
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Tabel structuur voor tabel `GP_LinkExchange`
#

CREATE TABLE GP_LinkExchange (
  ID int(10) NOT NULL auto_increment,
  Title varchar(30) NOT NULL default '',
  URL varchar(100) NOT NULL default '',
  Category int(2) NOT NULL default '0',
  HitsIn int(10) NOT NULL default '0',
  HitsOut int(10) NOT NULL default '0',
  Status tinyint(4) NOT NULL default '0',
  IP_Submit varchar(15) NOT NULL default '',
  Admin_Submit int(2) NOT NULL default '0',
  PRIMARY KEY  (ID)
) TYPE=MyISAM;

In GP_LE_Stats wordt opgeslagen welke links IP nummer X al heeft gezien nu moet ik dus een select query hebben die random een link kiest uit GP_Linkexchange waar HitsOut<HitsIn en waar het IP dus nog niet heengegaan is.

Ik ben nu al een uur bezig met het verzinnen van een query, maar kom er echt niet uit :{
IRC-Mensen weten het ook niet :/
Dus mijn allerlaadste redmiddel, GoT, please help me :P

  • Bolk
  • Registratie: Februari 2001
  • Niet online

Bolk

Change the equation.

NEE D2k! Dit is _NIET_ aan mij gevraagd FYI :P

Ik bespeur hier een zekere mate van onethische logica.


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Kweet eigenlijk niet of MySQL random functies heeft om direct in de query te gebruiken.. zou je de search even moeten gebruiken..

Anders kun je gewoon een count doen op goede data en vervolgens een limit random, random om er 1 random record uit te halen.

  • P.B.
  • Registratie: Juli 2001
  • Niet online
Bosmonster schreef op 20 oktober 2002 @ 22:16:
Kweet eigenlijk niet of MySQL random functies heeft om direct in de query te gebruiken.. zou je de search even moeten gebruiken..

Anders kun je gewoon een count doen op goede data en vervolgens een limit random, random om er 1 random record uit te halen.
Random functie doe ik gewoon met PHP, rand() :)

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Duncan schreef op 20 oktober 2002 @ 22:18:
[...]


Random functie doe ik gewoon met PHP, rand() :)


Jawel.. maar als het direct in een query kan scheelt dat je een hoop DB I/O.

Nu moet je eerst weten hoeveel goede data er is en vervolgens een random nemen daaruit om die ene record eruit te pikken (je wilt niet alles ophalen uiteraard om er vervolgens maar 1 van te gebruiken).

  • MaxxMark
  • Registratie: Januari 2000
  • Laatst online: 10:22

MaxxMark

HT is Tof!

je kan creatief de random gebruiken en iets doen als:
$random = rand(0,$max_goede_hits);
mysql_query($q="SELECT * FROM je_table WHERE je_vereisten LIMIT $random,1");
Op deze manier pak je er maar 1.. Al bedenk ik me net dat je op deze manier natuurlijk ook eigenlijk alle results pakt en er maar 1 van displayed :)

hmm,
nou ja ik vond hem wel creatief :)

T: @mark_prins - Kick ass developers: www.omniscale.nl - HT: Where it all went wrong...


  • P.B.
  • Registratie: Juli 2001
  • Niet online
Bosmonster schreef op 20 oktober 2002 @ 22:20:

[...]


Jawel.. maar als het direct in een query kan scheelt dat je een hoop DB I/O.

Nu moet je eerst weten hoeveel goede data er is en vervolgens een random nemen daaruit om die ene record eruit te pikken (je wilt niet alles ophalen uiteraard om er vervolgens maar 1 van te gebruiken).
Gaat ook direct in de query, ik zie nu dat RAND() ook een MySQL functie is..
RAND(N)
Returns a random floating-point value in the range 0 to 1.0. If an integer argument N is specified, it is used as the seed value:
mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881

You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. In MySQL Version 3.23, you can, however, do: SELECT * FROM table_name ORDER BY RAND()
Het probleem is dus dat ik één result moet hebben uit GP_LinkExchange, waarvan GP_LinkExchange.ID niet voorkomt in het GP_LE_Stats.LE_ID veld... maar het $REMOTE_ADDR moet dus wel overeenkomen met GP_LE_Stats.IP.

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Lijkt me een carthetisch (whatever :P) product opleveren, maar misschien dat je er wat mee kan ;)

SELECT * FROM GP_LinkExchange as A, GP_LE_Stats as B WHERE A.ID <> B.LE_ID AND B.IP = '$REMOTE_ADDR' AND A.HitsOut < A.HitsIn ORDER BY RAND() LIMIT 1

  • P.B.
  • Registratie: Juli 2001
  • Niet online
Bosmonster schreef op 20 oktober 2002 @ 22:35:
Lijkt me een carthetisch (whatever :P) product opleveren, maar misschien dat je er wat mee kan ;)

SELECT * FROM GP_LinkExchange as A, GP_LE_Stats as B WHERE A.ID <> B.ID AND B.IP = '$REMOTE_ADDR' ORDER BY RAND() LIMIT 1
Hij werkt in ieder geval (beetje angepast dan, namen van de columns) , ik ga morgen kijken of hij ok het gewenste resultaat oplevert :)

Thanks :)


EDIT: Ik kon het niet laten om het nu te proberen, en het geeft niet het gewenste resultaat op :/

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
SELECT Title,URL FROM GP_LinkExchange LEFT JOIN GP_LE_Stats ON ID=LE_ID WHERE HitsIn<HitsOut AND IP != 'x.x.x.x' ORDER BY RAND() LIMIT 1

Niet uitgeprobeerd, maar zoiets moet het zijn denk ik. Trouwens je kunt IPs opslaan als een unsigned int met de mysql functies INET_ATON en INET_NTOA of php functies ip2long() en long2ip(), scheelt ruimte in de database, en is makkelijker te indexen.

[ Voor 0% gewijzigd door _js_ op 20-10-2002 22:40 . Reden: Sorry voor de dubbel, te lang getypt :) ]


  • P.B.
  • Registratie: Juli 2001
  • Niet online
_js_ schreef op 20 oktober 2002 @ 22:38:
SELECT Title,URL FROM GP_LinkExchange LEFT JOIN GP_LE_Stats ON ID=LE_ID WHERE HitsIn<HitsOut AND IP != 'x.x.x.x' ORDER BY RAND() LIMIT 1

Niet uitgeprobeerd, maar zoiets moet het zijn denk ik. Trouwens je kunt IPs opslaan als een unsigned int met de mysql functies INET_ATON en INET_NTOA of php functies ip2long() en long2ip(), scheelt ruimte in de database, en is makkelijker te indexen.
Die van jou ook geprobeerd, maar levert ook niet het gewenste resultaat op :/

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

Duncan schreef op 20 oktober 2002 @ 22:45:
[...]


Die van jou ook geprobeerd, maar levert ook niet het gewenste resultaat op :/


Maar wat levert het dan wel op? :P Of wil je je probleem gaan "brute-forcen" ofzo? Gewoon alle mogelijke combinaties proberen?

Oftewel: kijken even wat het wel oplevert en probeer te achterhalen WAAROM en wat je eraan kunt doen.

  • P.B.
  • Registratie: Juli 2001
  • Niet online
Contents van GP_LinkExchange
code:
1
2
INSERT INTO GP_LinkExchange VALUES (1, 'Woei', 'http://www.klassieketalen.com', 0, 6, 0, 0, '', 0);
INSERT INTO GP_LinkExchange VALUES (2, 'Bla', 'http://www.msn.com', 0, 7, 0, 0, '', 0);

Query
SELECT * FROM GP_LinkExchange as A, GP_LE_Stats as B WHERE A.ID <> B.LE_ID AND B.IP = '213.10.173.26' ORDER BY RAND() LIMIT 1

Dit heb ik dus geprobeerd..
Normaal moet ie 1 resultaat geven, van die 2 sites, maar hij geeft geen enkele..

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 29-08 19:47

Bosmonster

*zucht*

uhh dat IP-adres zit wel in die andere tabel dan neem ik aan? :P

  • P.B.
  • Registratie: Juli 2001
  • Niet online
Bosmonster schreef op 20 oktober 2002 @ 23:36:
uhh dat IP-adres zit wel in die andere tabel dan neem ik aan? :P
Neen.
In die andere table zitten slechts logs van naar welke linkexchange de users al heengegaan zijn. Aangezien dit mijn eerste 'klik' is, staat mijn IP dus nog niet in die GP_LE_Stats table.




SELECT * FROM GP_LinkExchange WHERE GP_LinkExchange.ID NOT IN (SELECT GP_LE_Stats.LE_ID FROM GP_LE_Stats WHERE GP_LE_Stats.IP = '213.10.173.26') AND GP_LinkExchange.HitsIn>GP_LinkExchange.HitsOut LIMIT 1

Heb ik nu (met hulp van ACM), maar MySQL ondersteunt geen subquery's.
http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html

Ik kijk nu naar dit document, maar vooralsnog kom ik er niet uit.




GREAT NEWS!!!!!!!!!!!

SELECT GP_LinkExchange.* FROM GP_LinkExchange LEFT JOIN GP_LE_Stats ON GP_LinkExchange.ID = GP_LE_Stats.LE_ID AND GP_LE_Stats.IP = '213.10.173.26' WHERE GP_LE_Stats.LE_ID IS NULL AND GP_LinkExchange.HitsIn>GP_LinkExchange.HitsOut ORDER BY RAND() LIMIT 1


Ik heb 'm :) :) :) :) :)
Jullie allemaal heel erg bedankt :)
ACM ook heel erg bedankt :)
Pagina: 1