2010-06-16 6 views
1

J'ai un site où j'ai une base de données pour tous les comptes et autres joyeusetés, et une autre pour stocker les actions que l'utilisateur a fait sur le site.mysql - combiner des colonnes et des tables

Chaque utilisateur a sa propre table mais je veux combiner les données de chaque groupe d'utilisateurs (tous les utilisateurs qui sont "liés ensemble") et ordonner ces données au moment où les actions ont eu lieu.

Voici ce que j'ai;

<?php 
$query = "SELECT `TALKING_TO` FROM `nnn_instant_messaging` WHERE `AUTHOR` = '" . DISPLAY_NAME . "' AND `TALKING_TO` != ''"; 
$query = mysql_query($query, $CON) or die("_error_ " . mysql_error()); 
if(mysql_num_rows($query) != 0) { 
    $table_str = ""; 
    $select_ref_clause = "("; 
    $select_time_stamp_clause = "("; 
    while($row = mysql_fetch_array($query)) { 
     $table_str .= "`actvbiz_networks`.`" . $row['TALKING_TO'] . "`, "; 
     $select_ref_clause .= "`actvbiz_networks`.`" . $row['TALKING_TO'] . ".REF`, "; 
     $select_time_stamp_clause .= "`actvbiz_networks`.`" . $row['TALKING_TO'] . ".TIME_STAMP`, "; 
    } 
    $table_str = $table_str . "`actvbiz_networks`.`" . DISPLAY_NAME . "`"; 
    $select_ref_clause = substr($select_ref_clause, 0, -2) . ") AS `REF`, "; 
    $select_time_stamp_clause = substr($select_time_stamp_clause, 0, -2) . ") AS `TIME_STAMP`";  
}else{ 
    $table_str = "`actvbiz_networks`.`" . DISPLAY_NAME . "`"; 
    $select_ref_clause = "`REF`, "; 
    $select_time_stamp_clause = "`TIME_STAMP`"; 
} 
$where_clause = $select_ref_clause . $select_time_stamp_clause; 

$query = "SELECT " . $where_clause . " FROM " . $table_str . " ORDER BY TIME_STAMP"; 
die($query); 
$query = mysql_query($query, $CON) or die("_error_ " . mysql_error()); 
if(mysql_num_rows($query) != 0) { 

}else{ 
?> 
<p>Currently no actions have taken place in your network.</p> 
<?php 
} 
?> 

Le code ci-dessus renvoie l'instruction SQL:

SELECT (`actvbiz_networks`.`john_doe.REF`, `actvbiz_networks`.`Emmalene_Jackson.REF`) AS `REF`, (`actvbiz_networks`.`john_doe.TIME_STAMP`, `actvbiz_networks`.`Emmalene_Jackson.TIME_STAMP`) AS `TIME_STAMP` FROM `actvbiz_networks`.`john_doe`, `actvbiz_networks`.`Emmalene_Jackson`, `actvbiz_networks`.`act_web_designs` ORDER BY TIME_STAMP 

Je suis vraiment apprendre sur mes pieds avec SQL.

Ce n'est pas le PHP avec lequel j'ai un problème (je peux très bien coder avec PHP); C'est juste de l'aide avec l'instruction SQL.

Toute aide très appréciée.

Répondre

2

N'a pas pris le temps de traverser votre code, mais de la question, il semble que vous voulez UNION.

SELECT 
3 AS a 
UNION SELECT 
2 AS a 
UNION SELECT 
1 AS a 
ORDER BY a 

Donne

 
a 
= 
1 
2 
3 

EDIT: Alors peut-être quelque chose comme ça?

DROP TEMPORARY TABLE IF EXISTS t1; 
DROP TEMPORARY TABLE IF EXISTS t2; 
DROP TEMPORARY TABLE IF EXISTS tmp; 

CREATE TEMPORARY TABLE t1 (
a INT(11) 
); 

CREATE TEMPORARY TABLE t2 (
b INT(11) 
); 

INSERT INTO t1 VALUES (1), (2), (3); 
INSERT INTO t2 VALUES (4), (5), (6); 

CREATE TEMPORARY TABLE tmp 
SELECT 
b AS f 
FROM t2 
UNION SELECT 
a AS f 
FROM t1 
ORDER BY f; 

SELECT * FROM tmp; 

retours

 
f 
= 
1 
2 
3 
4 
5 
6 
+0

Je pense que vous êtes sur la bonne voie, mais la sortie est pas ce que je me attends. Imaginez 2 tables, exactement la même structure juste le nom et les données de la table. Je veux mettre temporairement toutes les données dans une table en tant que telle, si vous savez ce que je veux dire. –

0

Avez-vous essayé d'utiliser un view? De cette façon, vous pouvez utiliser l'UNION comme suggéré simendsjo et tout est dans une seule table. Ce n'est pas vraiment une solution temporaire mais une façon très agréable, propre et efficace de le faire.

0

J'endeed jusqu'à la résolution en utilisant les conseils de simendsjo et utilisé UNION ALL

<?php 
$query = "SELECT `TALKING_TO` FROM `nnn_instant_messaging` WHERE `AUTHOR` = '" . DISPLAY_NAME . "' AND `TALKING_TO` != ''"; 
$query = mysql_query($query, $CON) or die("_error_ " . mysql_error()); 
if(mysql_num_rows($query) != 0) { 
    while($row = mysql_fetch_array($query)) { 
     $table_str = 'SELECT REF, ACTION, TIME_STAMP, DATA, IMAGE, DISPLAY_NAME FROM actvbiz_networks.' . $row['TALKING_TO'] . ' UNION ALL '; 
    } 
}else{ 
    $table_str = ""; 
} 
$table_str = $table_str . 'SELECT REF, ACTION, TIME_STAMP, DATA, IMAGE, DISPLAY_NAME FROM actvbiz_networks.' . DISPLAY_NAME . ' ORDER BY TIME_STAMP DESC'; 

$query = mysql_query($table_str, $CON) or die("_error_ " . mysql_error()); 
if(mysql_num_rows($query) != 0) { 
    while($rows = mysql_fetch_array($query)) { 
+0

Oui, désolé. J'ai oublié de mentionner TOUS – simendsjo

Questions connexes