Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.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_Mysql_Sql - Fatal编程技术网

Php Mysql,结合连接和排序的多个查询

Php Mysql,结合连接和排序的多个查询,php,mysql,sql,Php,Mysql,Sql,我是MySQL的初学者,已经被卡住了。 我想我必须做一些高级的子查询来解决我的问题,但我不知道怎么做。有人能帮我吗 第一个查询连接三个表:annons、kontering_annons和member。 结果是唯一的annons.id条目。在我的例子中是3个结果。 问题是,我需要为每个唯一的annons.id查找表kontering_annons中的最后一个条目。但此查询不支持 SELECT annons.id, annons.id_user, member.saldo, member.id,

我是MySQL的初学者,已经被卡住了。 我想我必须做一些高级的子查询来解决我的问题,但我不知道怎么做。有人能帮我吗

第一个查询连接三个表:annons、kontering_annons和member。 结果是唯一的annons.id条目。在我的例子中是3个结果。 问题是,我需要为每个唯一的annons.id查找表kontering_annons中的最后一个条目。但此查询不支持

SELECT  annons.id, annons.id_user, member.saldo, member.id,
kontering_annons.id_annons, kontering_annons.dat_bet_till, 
kontering_annons.id_kontering_a, kontering_annons.dat_ut_member
FROM annons
LEFT JOIN kontering_annons 
ON kontering_annons.id_annons = annons.id
LEFT JOIN member
ON member.id = annons.id_user
WHERE (annons.status='3' OR annons.status='4')
AND annons.typ='d'
AND annons.startar < NOW() - 48*60*60
AND kontering_annons.dat_bet_till < CURRENT_DATE()
AND member.saldo >= $day_price
GROUP BY annons.id

您可以将以下查询保存到临时表中

SELECT a.*
FROM kontering_annons a
INNER JOIN (SELECT id_annons, dat_bet_till, dat_ut_member, 
max(id_kontering_a) AS maxid 
FROM kontering_annons 
GROUP BY id_annons) AS b 
ON a.id_kontering_a = b.maxid
AND a.dat_bet_till < CURRENT_DATE()
然后用主查询连接临时表,替换kontering_annons表

SELECT  annons.id, annons.id_user, member.saldo, member.id,
tempT.id_annons, tempT.dat_bet_till, 
tempT.id_kontering_a, tempT.dat_ut_member
FROM annons
LEFT JOIN tempT 
ON tempT.id_annons = annons.id
LEFT JOIN member
ON member.id = annons.id_user
WHERE (annons.status='3' OR annons.status='4')
AND annons.typ='d'
AND annons.startar < NOW() - 48*60*60
AND member.saldo >= $day_price
GROUP BY annons.id
试试这个:

SELECT  
  a.id, 
  a.id_user, 
  m.saldo, 
  m.id,
  k.id_annons, 
  k.dat_bet_till, 
  k.id_kontering_a, 
  k.dat_ut_member
FROM annons a
INNER JOIN
(
    SELECT 
      id_annons, 
      dat_bet_till, 
      max(id_kontering_a) AS maxid 
    FROM kontering_annons 
    GROUP BY id_annons
) km ON a.id = km.id_annons
LEFT JOIN kontering_annons k  ON k.id_annons     = km.id_annons 
                             AND k.id_kontering_a = km.maxid 
LEFT JOIN member           m  ON m.id            = a.id_user
WHERE (a.status='3' OR a.status='4')
AND a.typ='d'
AND a.startar < NOW() - 48*60*60
AND k.dat_bet_till < CURRENT_DATE()
AND m.saldo >= $day_price
在a.id=km.id_annons上,然后将其与kontering_annons连接,通过在kid_kontering_a=km.maxid上连接,仅选择该表中具有最后一个id_kontering_a的所有数据


注意:我使用了内部联接,然后使用两个左联接来保持它的左联接,否则如果您使用了左联接,然后使用内部联接来获得最大ID,那么它将是一个内部联接。

如果您不介意,请使用表架构和每个表的小样本数据集更新问题,好吗?:嗨,马哈茂德。伟大的我想这解决了我的问题。除了缺少一个点和一个应该是的孩子和k.id,它似乎起作用了。非常感谢@伍迪-不客气,欢迎来到SO。对不起,这个错误。现在修好了。顺便说一句:如果你觉得有用的话,试着检查答案左边的标记。这就是SO的工作原理。谢谢
SELECT  
  a.id, 
  a.id_user, 
  m.saldo, 
  m.id,
  k.id_annons, 
  k.dat_bet_till, 
  k.id_kontering_a, 
  k.dat_ut_member
FROM annons a
INNER JOIN
(
    SELECT 
      id_annons, 
      dat_bet_till, 
      max(id_kontering_a) AS maxid 
    FROM kontering_annons 
    GROUP BY id_annons
) km ON a.id = km.id_annons
LEFT JOIN kontering_annons k  ON k.id_annons     = km.id_annons 
                             AND k.id_kontering_a = km.maxid 
LEFT JOIN member           m  ON m.id            = a.id_user
WHERE (a.status='3' OR a.status='4')
AND a.typ='d'
AND a.startar < NOW() - 48*60*60
AND k.dat_bet_till < CURRENT_DATE()
AND m.saldo >= $day_price
    SELECT 
      id_annons, 
      dat_bet_till, 
      max(id_kontering_a) AS maxid 
    FROM kontering_annons 
    GROUP BY id_annons