Php MySQL外部联接从联接表中获取单独的行结果

Php MySQL外部联接从联接表中获取单独的行结果,php,mysql,sql,Php,Mysql,Sql,我试过这个问题 SELECT invoices.customer_id AS customer_id, invoices.id AS id, invoices.date AS date, due_date, bonus.date AS p_date, invoices.paid_date, total, bonus.amount AS p, invoices.paid, invoices.balance FROM ( ( SELECT inv.customer_id AS customer_id

我试过这个问题

SELECT invoices.customer_id AS customer_id, invoices.id AS id, invoices.date AS date, due_date, bonus.date AS p_date, invoices.paid_date, total, bonus.amount AS p, invoices.paid, invoices.balance
FROM (
(
SELECT inv.customer_id AS customer_id, inv.id AS id, inv.order_id AS order_id, inv.date AS date, due_date, 
  GROUP_CONCAT( CONCAT( DATE_FORMAT( p.date, '%d/%m/%Y' ) , ' (', p.amount, ')' ) SEPARATOR ', ' ) AS paid_date, 
  total, COALESCE( sum( p.amount ) , 0 ) AS paid, 
  ( total - COALESCE( sum( p.amount ) , 0 ) ) AS balance
FROM (
invoices inv
)
LEFT JOIN payments p ON p.invoice_id = inv.id
GROUP BY inv.id
)invoices
)
FULL OUTER JOIN bonus ON bonus.customer_id = invoices.customer_id
WHERE invoices.customer_id = '4'
GROUP BY invoices.order_id
ORDER BY date DESC
LIMIT 10
和获取SQL语法错误,但如果我尝试左/右而不是完全外部联接,并使用单个roe结果

CUSTOMER_ID     ID  DATE    DUE_DATE    P_DATE  PAID_DATE   TOTAL   P   PAID    BALANCE
4   1   April, 24 2014 09:38:26+0000    April, 30 2014 00:00:00+0000    May, 10 2014 05:02:31+0000  28/04/2014 (10.00), 25/04/2014 (10.00), 25/04/2014 (150.00), 25/04/2014 (390.00)    680     100     560     120

现在的问题是我需要p_DATE和p作为单独的行来显示奖金。你能帮我修改我的查询,这样我就可以得到奖金表记录P_DATE和P作为单独的行,其他作为单独的行


谢谢

我认为不可能像你说的那样(你应该使用两条SQL语句) 你能解释一下这个目标是什么吗,也许我们可以用另一种方式来做。

试试这个

SELECT invoices.customer_id AS customer_id, invoices.id AS 
id, invoices.date AS DATE, due_date AS due_date,  invoices.paid_date AS paid_date, total AS total, invoices.paid AS paid, invoices.balance AS balance
FROM (
(SELECT inv.customer_id AS customer_id, inv.id AS id, inv.order_id AS order_id, inv.date AS DATE, due_date, 
  GROUP_CONCAT( CONCAT( DATE_FORMAT( p.date, '%d/%m/%Y' ) , ' (', p.amount, ')' ) SEPARATOR ', ' ) AS paid_date, 
  total, COALESCE( SUM( p.amount ) , 0 ) AS paid, 
  ( total - COALESCE( SUM( p.amount ) , 0 ) ) AS balance
FROM (
invoices inv
)
RIGHT  JOIN payments p ON p.invoice_id = inv.id
GROUP BY inv.id
)invoices
)
RIGHT JOIN bonus ON bonus.customer_id = invoices.customer_id
WHERE invoices.customer_id = '4'
GROUP BY invoices.order_id
UNION 
SELECT '' AS customer_id, '' AS 
id, '' AS DATE, '' due_date, bonus.date AS paid_date, '' total, bonus.amount AS paid, '' balance
FROM (
(SELECT inv.customer_id AS customer_id, inv.id AS id, inv.order_id AS order_id, inv.date AS DATE, due_date, 
  GROUP_CONCAT( CONCAT( DATE_FORMAT( p.date, '%d/%m/%Y' ) , ' (', p.amount, ')' ) SEPARATOR ', ' ) AS paid_date, 
  total, COALESCE( SUM( p.amount ) , 0 ) AS paid, 
  ( total - COALESCE( SUM( p.amount ) , 0 ) ) AS balance
FROM (
invoices inv
)
RIGHT  JOIN payments p ON p.invoice_id = inv.id
GROUP BY inv.id
)invoices
)
RIGHT JOIN bonus ON bonus.customer_id = invoices.customer_id
WHERE invoices.customer_id = '4'
GROUP BY invoices.order_id
ORDER BY DATE DESC
LIMIT 10

不太明白,mysql没有完全的外部连接,需要用左外部连接和右外部连接来完成。现在,对于您的问题,您是否可以更新问题并添加相同的输出而不是图像?谢谢您的时间。我已经共享了SQLFIDDLE链接,您可以在SQLFIDDLE上看到真实的结果和查询,期望的结果是image2。您共享的图像无法用sql完成,您正在尝试洗牌列值。我需要在新行中显示P_日期和P列。如果这可以是dome?我已经共享了SQLFIDLE链接,如果您可以通过任何其他方式获得所需的结果(图像),我将不胜感激。谢谢您,是的,这是我想要的结果,您可以将此查询压缩或缩小吗?多谢各位much@Saleem非常感谢。很高兴听到这个答案很有用。您可以接受答案,以便对其他人有用。我已经接受了答案,但我对解决方案有异议,因为第二行未包含在结果@Saleem中。我根据您的问题陈述尝试过。请清楚地告诉我们您到底想要实现什么,以便我们清楚地了解您的解决方案是好的,但一旦我获得第二笔奖金,它就不会出现。我需要在单独的行中显示所有奖金,并在单独的行中显示发票数据。我们在那里吃饭。谢谢你的帮助