加入同一张桌子?

时间:2010-08-18 18:26:30

标签: php mysql

我必须在DB中执行SELECT操作。由于我想缩小搜索结果的范围,我想知道是否应该使用嵌套的SELECT或使用JOIN操作?

我想在桌面上进行双重搜索。我没有成功尝试过这个:

$receive_listings = mysql_query('SELECT * 
                                   from show_detail 
                                  WHERE ch_id="0140.zee.in" IN ('SELECT * 
                                                                   FROM show_detail 
                                                                  WHERE `date_column` BETWEEN `2010-08-17` AND `2010-08-18`')'
                                ) or die("ERROR: $receive_by_show_id.".mysql_error());

抛出错误:

Parse error: syntax error, unexpected T_VARIABLE in /Applications/XAMPP/xamppfiles/htdocs/play/browse-channels-shows.php on line 17

我想知道JOIN操作是否能更有效地完成这个技巧?

4 个答案:

答案 0 :(得分:1)

由于其他人已经解决了您的解析错误,您最终会遇到第二个错误,因为您的查询不正确。

我假设您尝试在两个日期之间获取项目并与ch_id匹配:

SELECT * from show_detail WHERE ch_id="0140.zee.in" AND (`date_column` BETWEEN `2010-08-17` AND `2010-08-18`')

答案 1 :(得分:1)

此处的所有答案都未能显示Double引号不能用于包围值。你必须使用单引号。

$receive_listings = mysql_query("SELECT * 
        from show_detail 
        WHERE ch_id='0140.zee.in' IN (SELECT * 
              FROM show_detail 
              WHERE `date_column` BETWEEN '2010-08-17' AND '2010-08-18')") or die("ERROR: $receive_by_show_id. ".mysql_error());

应该是MySQL和PHP的正确版本。

答案 2 :(得分:1)

这是你的查询被重写为更具可读性。

$query <<<EOL
SELECT *
FROM show_detail
WHERE ch_id = "0140.zee.in" IN (
    SELECT *
    FROM show_detail
    WHERE `date_column` BETWEEN '2010-08-17' AND '2010-0818'
);
EOL;

您显然在show_detail表中有多个列,但您在子查询中选择了所有列。这是非法的语法。子查询必须返回最多1个值(如果它用于相等性测试(... WHERE field = (SELECT someval FROM...))),或者一个列,如果它在IN子句中使用。如果其他所有内容都正确,您的查询仍会返回ERROR 1241 (21000): Operand should contain 1 column(s)

除非你有一些完全疯狂的东西,你不需要子查询来做这件事,你只需要一个AND条款,就像CFreak在他的回答中所说的那样。

答案 3 :(得分:0)

$receive_listings = mysql_query('SELECT * from show_detail WHERE ch_id="0140.zee.in" IN (SELECT * FROM show_detail WHERE `date_column` BETWEEN `2010-08-17` AND `2010-08-18`)') or die("ERROR: $receive_by_show_id.".mysql_error()); 

我认为可能需要这样。