だから私はデバッグしていたこの超長いクエリを持っています。列 s.name と他のすべての JOIN 列が「フィールド リスト」にないというエラーを最初に受け取ったので、いくつかのグーグル検索の後、それらを二重引用符で囲むことでそのエラーを修正できました。そのため、クエリはエラーなしでリソースを返しますが、リソースは空です。
ステートメントの後のエコーから得られるのは、「Resource id #4 Warning: implode(): Invalid arguments passed in /var/www/beta/index.php on line 143 0」です。
クエリとその周辺の関数は次のとおりです。
<?php /* other functions preceding */ $result = mysql_query("SELECT * FROM users WHERE uid=" . $_SESSION['uid'] . "");
$cur_user = mysql_fetch_array($result);
$ufriends = explode(';', $cur_user['friends']);
$ufsql = trim(implode(',',$ufriends),',');
$uevents = explode(';', $cur_user['events']);
$uesql = trim(implode(',',$uevents),',');
$urequests = explode(';', $cur_user['requests']);
$ursql = trim(implode(',',$urequests),',');
if (!empty($ufriends)) {
$time1 = microtime();
$megaresult = mysql_query("
( SELECT \"s.name\" AS source_name, NULL AS target_name, recent_updates.*, 1 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
WHERE update_type='10'
LIMIT 1
)
UNION
( SELECT \"s.name\" AS source_name, NULL AS target_name, recent_updates.*, 2 as ORD FROM recent_updates
INNER JOIN users AS su ON (\"s.uid\"=recent_updates.source_id)
WHERE update_type='10'
LIMIT 1,9
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN users AS t ON (\"t.uid\"=recent_updates.target_id)
WHERE update_type='2'
AND
( target_id IN (" . $ufsql . ") )
AND
( source_id IN (" . $ufsql . ") )
OR
(
( target_id IN (" . $cur_user['uid'] . ") )
AND
( source_id IN (" . $ufsql . ") )
)
OR
(
( target_id IN (" . $ufsql . ") )
AND
( source_id IN (" . $cur_user['uid'] . ") )
)
LIMIT 0,10
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN users AS t ON (\"t.uid\"=recent_updates.target_id)
WHERE update_type='4'
AND
(
( target_id IN (" . $ufsql . ") )
AND
( source_id IN (" . $ufsql . ") )
)
OR
(
( target_id IN (" . $cur_user['uid'] . ") )
AND
( source_id IN (" . $ufsql . ") )
)
OR
(
( target_id IN (" . $ufsql . ") )
AND
( source_id IN (" . $cur_user['uid'] . ") )
)
LIMIT 0,10
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
WHERE update_type='3'
AND
target_id IN (" . $uesql . ")
LIMIT 0,10
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
WHERE update_type='3'
AND
target_id IN (" . $ursql . ")
LIMIT 0,10
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
WHERE update_type='5'
AND
target_id IN (" . $ursql . ")
LIMIT 0,10
)
UNION
( SELECT \"s.name\" AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN users AS s ON (\"s.uid\"=recent_updates.source_id)
INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
WHERE update_type='11'
AND
(
target_id IN (" . $uesql . ")
OR
target_id IN (" . $ursql . ")
)
AND
(
source_id IN (" . $ufsql . ")
)
LIMIT 0,10
)
UNION
( SELECT NULL AS source_name, \"t.name\" AS target_name, recent_updates.*, 2 AS ORD FROM recent_updates
INNER JOIN events AS t ON (\"t.id\"=recent_updates.target_id)
WHERE public != 0 LIMIT 0,10
)
ORDER BY ORD ASC, time_un DESC");
echo $megaresult;
$feed = mysql_fetch_array($megaresult);
echo mysql_error();
$time2 = microtime();
echo implode('##', $feed);
echo mysql_num_rows($megaresult);
echo mysql_info($con);
/* brackets closed, etc */ ?>
エイリアス化された列を二重引用符で囲むことに関係があると感じています。このクエリの以前のバージョンには、完全に正常に機能する JOIN 部分が含まれていなかったので、pastebin にアップロードしました: http://pastebin.com/upifa7VJ
編集:
うーん、これは恥ずかしいです...引用符が問題を引き起こしていると疑うのは正しかったです(@andrewtweberに感謝します!)が、引用符なしで得られたエラーは、2番目のSELECTステートメントのタイプミスによるものでした、 INNER JOIN users AS sとしての INNER JOIN ユーザーの代わりにsu。みんな助けてくれてありがとう!