mysql - 组合列和表

时间:2010-06-16 04:52:22

标签: mysql join

我有一个网站,我有一个数据库用于所有帐户和诸如此类的东西,另一个用于存储用户在网站上执行的操作。

每个用户都有自己的表,但我希望将每个用户组的数据(所有“链接在一起”的用户)组合在一起,并在操作发生时对这些数据进行排序。

这就是我所拥有的;

<?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   
}
?>

上面的代码返回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

我正在用SQL学习。

它不是PHP我遇到的问题(我可以用PHP编写代码);它只是对SQL语句的帮助。

任何帮助都非常感激。

3 个答案:

答案 0 :(得分:2)

没有花时间通过你的代码,但从问题看起来你想要UNION。

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

给出

a
=
1
2
3
编辑:那么也许是这样的?

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;

返回

f
=
1
2
3
4
5
6

答案 1 :(得分:0)

您是否尝试使用view?这样,你可以使用UNION作为simendsjo建议,一切都在一个表中。这不是一个临时解决方案,而是一种非常好,干净,高效的方法。

答案 2 :(得分:0)

我最终通过使用simendsjo的提示并使用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 ) ) {