• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Komplizierte Abfrage (Hat jemand eine Idee wie?)

Kojaky

Neues Mitglied
Also ich möchte die Freunde aller Chars abfragen und ihren Namen sowie den Online Status ausgeben. Die Tabellen sind so aufgebaut:

friends
PHP:
CREATE TABLE IF NOT EXISTS `friends` (
  `char_id` int(11) NOT NULL default '0',
  `friend_account` int(11) NOT NULL default '0',
  `friend_id` int(11) NOT NULL default '0',
  KEY  `char_id` (`char_id`)
) ENGINE=MyISAM;
char
PHP:
CREATE TABLE IF NOT EXISTS `char` (
  `char_id` int(11) unsigned NOT NULL auto_increment,
  `account_id` int(11) unsigned NOT NULL default '0',
  `char_num` tinyint(1) NOT NULL default '0',
  `name` varchar(30) NOT NULL default '',
  `class` smallint(6) unsigned NOT NULL default '0',
  `base_level` smallint(6) unsigned NOT NULL default '1',
  `job_level` smallint(6) unsigned NOT NULL default '1',
  `base_exp` bigint(20) unsigned NOT NULL default '0',
  `job_exp` bigint(20) unsigned NOT NULL default '0',
  `zeny` int(11) unsigned NOT NULL default '0',
  `str` smallint(4) unsigned NOT NULL default '0',
  `agi` smallint(4) unsigned NOT NULL default '0',
  `vit` smallint(4) unsigned NOT NULL default '0',
  `int` smallint(4) unsigned NOT NULL default '0',
  `dex` smallint(4) unsigned NOT NULL default '0',
  `luk` smallint(4) unsigned NOT NULL default '0',
  `max_hp` mediumint(8) unsigned NOT NULL default '0',
  `hp` mediumint(8) unsigned NOT NULL default '0',
  `max_sp` mediumint(6) unsigned NOT NULL default '0',
  `sp` mediumint(6) unsigned NOT NULL default '0',
  `status_point` smallint(4) unsigned NOT NULL default '0',
  `skill_point` smallint(4) unsigned NOT NULL default '0',
  `option` int(11) NOT NULL default '0',
  `karma` tinyint(3) NOT NULL default '0',
  `manner` tinyint(3) NOT NULL default '0',
  `party_id` int(11) unsigned NOT NULL default '0',
  `guild_id` int(11) unsigned NOT NULL default '0',
  `pet_id` int(11) unsigned NOT NULL default '0',
  `homun_id` int(11) unsigned NOT NULL default '0',
  `hair` tinyint(4) unsigned NOT NULL default '0',
  `hair_color` smallint(5) unsigned NOT NULL default '0',
  `clothes_color` smallint(5) unsigned NOT NULL default '0',
  `weapon` smallint(6) unsigned NOT NULL default '1',
  `shield` smallint(6) unsigned NOT NULL default '0',
  `head_top` smallint(6) unsigned NOT NULL default '0',
  `head_mid` smallint(6) unsigned NOT NULL default '0',
  `head_bottom` smallint(6) unsigned NOT NULL default '0',
  `last_map` varchar(11) NOT NULL default '',
  `last_x` smallint(4) unsigned NOT NULL default '53',
  `last_y` smallint(4) unsigned NOT NULL default '111',
  `save_map` varchar(11) NOT NULL default '',
  `save_x` smallint(4) unsigned NOT NULL default '53',
  `save_y` smallint(4) unsigned NOT NULL default '111',
  `partner_id` int(11) unsigned NOT NULL default '0',
  `online` tinyint(2) NOT NULL default '0',
  `father` int(11) unsigned NOT NULL default '0',
  `mother` int(11) unsigned NOT NULL default '0',
  `child` int(11) unsigned NOT NULL default '0',
  `fame` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`char_id`),
  KEY `account_id` (`account_id`),
  KEY `party_id` (`party_id`),
  KEY `guild_id` (`guild_id`),
  KEY `name` (`name`),
  KEY `online` (`online`)
) ENGINE=MyISAM AUTO_INCREMENT=150000;
Als abfrage zu welchem account es gehört benutze ich die "account_id"
aus dieser Tabelle:

PHP:
CREATE TABLE IF NOT EXISTS `login` (
  `account_id` int(11) unsigned NOT NULL auto_increment,
  `userid` varchar(23) NOT NULL default '',
  `user_pass` varchar(32) NOT NULL default '',
  `lastlogin` datetime NOT NULL default '0000-00-00 00:00:00',
  `sex` enum('M','F','S') NOT NULL default 'M',
  `logincount` mediumint(9) unsigned NOT NULL default '0',
  `email` varchar(39) NOT NULL default '',
  `level` tinyint(3) NOT NULL default '0',
  `error_message` smallint(11) unsigned NOT NULL default '0',
  `connect_until` int(11) unsigned NOT NULL default '0',
  `last_ip` varchar(100) NOT NULL default '',
  `memo` smallint(11) unsigned NOT NULL default '0',
  `ban_until` int(11) unsigned NOT NULL default '0',
  `state` int(11) unsigned NOT NULL default '0',
  PRIMARY KEY  (`account_id`),
  KEY `name` (`userid`)
) ENGINE=MyISAM AUTO_INCREMENT=2000000;
also z.B. mit

PHP:
$query = "SELECT `account_id` FROM `login` WHERE `web_userid`='".$_REQUEST['nickname']."'";
$abfrage = mysql_query($query);
$row = mysql_fetch_assoc($abfrage);

$accid = $row['account_id'];
jetzt kann ich ja aus der Tabelle char folgendes abfragen

PHP:
$que = "SELECT `char_id` FROM `char` WHERE `account_id`='$accid'";
$ask = mysql_query($que);
$ro = mysql_fetch_assoc($ask);
Somit hätte ich nun alle char_id des Accounts.
Und jetzt komm ich nicht mehr weiter:

die aus der Tabelle friend stammende friend_id
ist die char_id des Freundes also müsste ich
nur irgentwie die friend_id abfragen um sie wieder mit der char_id aus der tabelle char
zusammenzubringen damit ich dort den name abfragen kann.

Hat jemand einen lösungsansatz?
 
Eine Tabelle kannst Du auch mehrfach in einem Statement verwenden, musst nur auf jeweils einen anderen Alias achten.

Code:
SELECT c.name

FROM char AS c_own, char AS c_foreign

WHERE c_own.char_id = '".$accid."'
AND c_own.friend_id = c_foreign.char_id
 
So ich hab es mal nach meiner denkweise versucht, funktioniert, aber sieht irgentwie schrecklich aus^^
und vorallem will ich das keine ausgabe doppelt vorkommt. Wieso? Es sollen mehrere Charactere gleichzeitig abgefragt werden, aber deren Freunde aus der Freundesliste nur 1x ausgegeben werden.

Hier das furchterregende Script:
PHP:
<?php
error_reporting(E_ALL);
include ('****');

        mysql_connect($****, $****, $****);
        mysql_select_db($daba);
        

$ask = "SELECT `account_id` FROM `login` WHERE `web_userid`='".$_REQUEST['nickname']."'";
$is = mysql_query($ask);
$ro = mysql_fetch_assoc($is);

$accid = $ro['account_id'];        

echo "<font style='text-align:left;font-family:Calibri,Cambria,sans-serif,Arial;font-size:12px;color:rgb(0,0,0);'>";
echo '<table border="2px #000000" cellpadding="0" cellspacing="0">';
echo "<tr>";
echo '<td width="100">Name</td><td width="100">Level</td><td width="100">Job Level</td><td width="100">Status</td>';
echo "</tr>";
       
$query="SELECT char_id FROM `char` WHERE account_id = '$accid'";
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result)){

$charid = $row['char_id'];        

$que="SELECT friend_id FROM `friends` WHERE char_id = '$charid'";
$out = mysql_query($que);
while($gimme = mysql_fetch_assoc($out)){

$friend = $gimme['friend_id'];

$quea="SELECT name,base_level,job_level,online FROM `char` WHERE char_id = '$friend'";
$outa = mysql_query($quea);
while($give = mysql_fetch_assoc($outa)){

$on = $give['online'];
$stat = array("0","1"); 
$status = array("<font style='color:#cf2200;'>Offline</font>","<font style='color:#00c800;'>Online</font>");
$online = str_replace($stat,$status,$on);

?><tr><td><?echo $give['name'];?></td><?
?><td><?echo $give['base_level'];?></td><?
?><td><?echo $give['job_level'];?></td><?
?><td><?echo "$online";?></td>

<?
}}}
?>
</tr>
</table>
</font>
Wie gesagt, mehrer Charactere sollen abgefragt werden, aber auch bei doppelt vorkommenden Freunden nur jeweils einer ausgegeben werden.

Bsp.:
Code:
Name    Level    Job Level    Status
Cookie    70        1            Offline
Swordy    14        1            Offline
Novice    13        1            Offline<--doppelt mit
Novice    13        1            Offline<--dem hier
und so soll es sein:
Code:
Name    Level    Job Level    Status
Cookie    70        1            Offline
Swordy    14        1            Offline
Novice    13        1            Offline
 
Zuletzt bearbeitet:
Mehrere Char's? Also kein Loginscript wie es oben aussah? Dann brauchst Du ja auch nur 1 Statement eigentlich. Schau dir meines nochmal an, ich sehe nicht, dass Du irgendwas davon umgesetzt hast.
 
Nein es soll eine Abfrage werden die alle Freunde aller Charactere eines Accounts ausgibt.
Das bedeutet ich muss erst abfragen um welchen account es sich handelt, das mache ich aus einem cookie heraus
dann muss ich aus der Tabelle char die char_id´s aller Charactere beziehen das können bis zu 12 Stück sein.
Jetzt muss ich mit den char_id´s des Accounts in die Tabelle friend und dort die char_id´s mit den char_id´s abzugleichen
und dadurch die friend_id beziehen. Mit der friend_id muss ich dann erneut in die Tabelle char um dort über die friend_id´s
die einzelnen Characternamen etc. zu bekommen. Mit deinem vorschlag funktioniert das nur leider irgentwie nicht, daher habe ich ihn nicht anwenden können, oder ich bin einfach zu doof dazu ihn mir zurecht zu legen. Wie gesagt die Abfrage oben Funktioniert, aber sie kann auch doppelte Daten ausgeben, wenn zwei Charactere ein und den selben Freund haben.

Das is das was es für mich so kompliziert macht. Von der Sicherheit mal abgesehen.
 
Zurück
Oben