Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql。随机订购位置和加入列表_Php_Sql_Mysql_Greatest N Per Group_Ranking - Fatal编程技术网

Php Mysql。随机订购位置和加入列表

Php Mysql。随机订购位置和加入列表,php,sql,mysql,greatest-n-per-group,ranking,Php,Sql,Mysql,Greatest N Per Group,Ranking,我有两个表:位置和列表 位置 id标题地址纬度经度 列表 id位置信息状态 SELECT locations.title, locations.address, ( 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('".$center_lng."') ) + sin( radians('

我有两个表:位置和列表

位置
id
标题
地址
纬度
经度

列表
id
位置
信息
状态

SELECT locations.title, 
       locations.address, 
       ( 3959 * acos( cos( radians('".$center_lat."') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('".$center_lng."') ) + sin( radians('".$center_lat."') ) * sin( radians( latitude ) ) ) ) AS distance      
  FROM locations 
ORDER BY distance
这将根据用户提供的纬度和经度,按位置顺序列出位置。很好,但我真正想做的是

  • 每个位置列出一个“列表”,并使位置保持有序
  • 如果一个地点有一个以上的“列表”,那么它必须是完全随机的
  • 在一个SQL查询中完成这一切会更好吗? 或者填充至少有一个“列表”的所有位置,然后使用另一个查询为该位置随机选择一个“列表”

    更新

    提供了创建表:

    CREATE TABLE `listings` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `token` varchar(4) DEFAULT NULL,
      `location` varchar(45) DEFAULT NULL,
      `info` varchar(45) DEFAULT NULL,
      `status` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;
    
    CREATE TABLE `locations` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(45) DEFAULT NULL,
      `address_street` varchar(45) DEFAULT NULL,
      `addrees_city` varchar(45) DEFAULT NULL,
      `address_state` varchar(45) DEFAULT NULL,
      `address_zip` varchar(45) DEFAULT NULL,
      `latitude` decimal(10,6) DEFAULT NULL,
      `longitude` decimal(10,6) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
    

    要输出locations.title,如果位置在“listings”表中至少有一行与其关联,请使用:

    SELECT loc.title
      FROM LOCATIONS loc
     WHERE EXISTS(SELECT NULL
                    FROM LISTING li
                   WHERE li.location = loc.id)
    
    使用:

    使用MySQL 5.1.49-community,我已经成功地通过上面的查询呈现了所需的结果

    我无法使用以下命令复制OP的重复行:

    创建表 插入语句:
    要输出locations.title,如果位置在“listings”表中至少有一行与其关联,请使用:

    SELECT loc.title
      FROM LOCATIONS loc
     WHERE EXISTS(SELECT NULL
                    FROM LISTING li
                   WHERE li.location = loc.id)
    
    使用:

    使用MySQL 5.1.49-community,我已经成功地通过上面的查询呈现了所需的结果

    我无法使用以下命令复制OP的重复行:

    创建表 插入语句:
    看起来不错,但是我在“@location:=loc.id FROM LOCATIONS LEFT JOIN LISTINGS li”附近发现了一个语法错误,我似乎无法理解它。@Chad Whitaker:我在“AS rank”后面缺少一个逗号,更正了。它现在可以工作了,但是。。1.它显示没有“列表”2的“位置”。如果一个位置有多个项目,则该项目似乎不是随机的。@Chad Whitaker:您最初的订购不包括是否有关联的
    列表
    ,因此
    左连接
    将产生相同的结果。如果您不想看到
    位置
    记录中至少没有一条
    列表
    记录,请将“LEFT JOIN LISTINGS”更改为“JOIN LISTINGS”。@Chad Whitaker:
    按loc.id排序,RAND()
    可确保在
    位置.id
    排序之外的行是MySQL允许的任意行。请记住,两条
    列表
    记录的随机顺序不会显得那么随机;)看起来不错,但是我在“@location:=loc.id FROM LOCATIONS LEFT JOIN LISTINGS li”附近发现了一个语法错误,我似乎无法理解它。@Chad Whitaker:我在“AS rank”后面缺少一个逗号,更正了。它现在可以工作了,但是。。1.它显示没有“列表”2的“位置”。如果一个位置有多个项目,则该项目似乎不是随机的。@Chad Whitaker:您最初的订购不包括是否有关联的
    列表
    ,因此
    左连接
    将产生相同的结果。如果您不想看到
    位置
    记录中至少没有一条
    列表
    记录,请将“LEFT JOIN LISTINGS”更改为“JOIN LISTINGS”。@Chad Whitaker:
    按loc.id排序,RAND()
    可确保在
    位置.id
    排序之外的行是MySQL允许的任意行。请记住,两条
    列表
    记录的随机顺序不会显得那么随机;)
    CREATE TABLE `locations` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(45) DEFAULT NULL,
      `address_street` varchar(45) DEFAULT NULL,
      `address_city` varchar(45) DEFAULT NULL,
      `address_state` varchar(45) DEFAULT NULL,
      `address_zip` varchar(45) DEFAULT NULL,
      `latitude` decimal(10,6) DEFAULT NULL,
      `longitude` decimal(10,6) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1$$
    
    CREATE TABLE `listings` (
      `id` int(11) NOT NULL,
      `token` varchar(4) DEFAULT NULL,
      `location` varchar(45) DEFAULT NULL,
      `info` varchar(45) DEFAULT NULL,
      `status` varchar(45) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$
    
    INSERT INTO `locations` 
    VALUES (1,'John\'s Ice Cream','1701 S Martin Luther King Jr Blvd','Lansing','MI','48910','42.714672','-84.567139'),
           (2,'7 Eleven','3500 Okemos Rd','Okemos','MI','48864','42.683331','-84.431709'),
           (3,'Kurt\'s Pizza','213 Ann St.','East Lansing','MI','48823','42.736053','-84.481636'),
           (4,'Walmart','16275 National Pkwy','Lansing','MI','48906','42.780350','-84.637238'),
           (5,'Alex\'s Hot dog Shop','8505 Delta Market Dr','Lansing','MI','48917','42.739830','-84.677330');
    
    INSERT INTO `listings` 
    VALUES (19,'39c4','1','5 gallons for $8','active'),
           (21,'89dF','4','2 mens shirts for $2','active'),
           (22,'67oP','1','Ice cream cones for $1','active'),
           (23,'5tG8','2','Large soft drinks only $0.99!','active');