0

我(新手)很难理解这个查询:

$result = mysql_query("
SELECT q.*, IF(v.id,1,0) AS voted
FROM quotes AS q
LEFT JOIN quotes_votes AS v 
ON  q.id = v.qid
    AND v.ip =".$ip."
    AND v.date_submit = '".$today."'
");  

任何人都可以通过 if 语句和 v.id,1,0 提供有关这些短符号(如 'q.*')的更多信息。有什么资料可以阅读更多相关信息吗?

非常感谢你。

这就是表格的样子:

CREATE TABLE `quotes` (
      `id` smallint(5) unsigned NOT NULL auto_increment,
      `txt` varchar(255) collate utf8_unicode_ci NOT NULL default '',
      `author` varchar(32) collate utf8_unicode_ci NOT NULL default '',
      `bgc` varchar(32) collate utf8_unicode_ci NOT NULL default '',
      `votes` mediumint(9) unsigned NOT NULL default '0',
      `vsum` int(11) unsigned NOT NULL default '0',
      `rating` double NOT NULL default '0',
      PRIMARY KEY  (`id`),
      KEY `rating` (`rating`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16 ;

CREATE TABLE `quotes_votes` (
  `id` mediumint(9) unsigned NOT NULL auto_increment,
  `qid` smallint(6) unsigned NOT NULL default '0',
  `ip` int(10) NOT NULL default '0',
  `vote` tinyint(1) NOT NULL default '0',
  `date_submit` date NOT NULL default '0000-00-00',
  `dt_submit` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `qid` (`qid`,`ip`,`date_submit`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4

1 回答 1

1

关于select q.*,它只是意味着从 table 别名中获取所有字段q,这恰好是 table quotes。这就像select *但只是一张桌子。

对于IF(v.id,1,0),那真是一个MySQLism。该IF语句计算第一个参数中给出的表达式,如果是true,则返回第二个参数。否则返回第三个参数。所以你知道 a1或 a0会从IF. 您现在可能想知道如何v.id评估以返回逻辑值,其背后的原因是 MySQL 将布尔值视为TINYINT(1)在其中0被视为false和非零值被视为true.

因此,这将被改写为IF(v.id != 0, 1, 0)可能更容易阅读的内容。鉴于v.id不能为空,那么您可以这样重写IF(v.id = 0, 0, 1)。无论如何,您可以更进一步,只需将其替换为v.id != 0:)

于 2013-11-04T15:20:29.583 回答