2014-11-08 26 views
0

我想把两个查询放在一起;一个来自我的posts表格,另一个来自我的store_products表格,并将结果显示在同一页面上。mySQL多选:1复杂1简单

,所以我想利用这个......

SELECT 
     p.id AS pid 
    , p.uid 
    , p.title 
    , p.created_at 
    , u.id AS uid 
    , u.username 
    , u.avatar 
    , f.following 
    , l.uid AS liked 
    , u2.username AS source_username 
    , u2.avatar AS source_avatar 
    , u2.created_at AS source_created_at 
FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
LEFT JOIN posts_likes l ON l.pid=p.id 
LEFT JOIN follow f ON u.id = f.following 
LEFT JOIN posts p2 ON p.source_hash = p2.hash 
LEFT JOIN users u2 ON u2.id = p2.uid 
WHERE (f.user=2 OR p.uid=2) 
GROUP BY p.id ORDER BY p.id DESC 

,并把它与这样的事情...

SELECT name, price FROM store_products WHERE uid=2 

我试过多次SELECT陈述,UNION,在那里我” d通过使用NULL弥补cols的差异,我试过LEFT,RIGHTINNER联接,但所有这些操作都是将产品信息添加到其他邮政行中,而不是创建se为每个产品分配行。

的结果集,我找的就是类似于这个

[0] Post 1 
[1] Post 2 
[2] Product 1 
[3] Post 3 
[4] Product 2 

等等

编辑:回答问题。两个表之间的唯一关系是用户标识,否则它们是完全独立的。我想为访问者提供帖子和产品的列表,并且我试图在一个查询中执行此操作以节省服务器负载,并且将它们放在同一列表中而不是单独的列表中。

+0

帖子和产品之间是否有任何关系?为什么'Post 2'后的产品1? – Barmar 2014-11-08 18:34:26

+0

你的问题不是很清楚。帖子和产品之间有什么关系?你能提供一些样本数据吗? – abl 2014-11-08 18:34:41

+0

'SELECT ...,sp.name,sp.price ... ... LEFT JOIN users on ON p.uid = u.id LEFT JOIN store_products AS sp ON(sp.uid = u.uid)'will do你问:为每个产品添加行,这两个额外的列中的每一列都会报告产品的名称和价格(或NULL)。 **但是,如何显示这个**,它不是MySQL的辖区。您需要添加一些关于您用来制作您的“网页”的内容,或许还有一些问题标签。很可能你应该*做的是将这两个查询分开,并将它们以不同的方式集成到你选择的CMS中。 – LSerni 2014-11-08 18:37:44

回答

0

使用UNION:

SELECT 
     "Post" AS type, 
    , p.id AS pid 
    , p.uid 
    , p.title 
    , p.created_at 
    , u.id AS uid 
    , u.username 
    , u.avatar 
    , f.following 
    , l.uid AS liked 
    , u2.username AS source_username 
    , u2.avatar AS source_avatar 
    , u2.created_at AS source_created_at 
    , NULL AS product_name 
    , NULL AS price 
FROM posts p 
LEFT JOIN users u ON p.uid=u.id 
LEFT JOIN posts_likes l ON l.pid=p.id 
LEFT JOIN follow f ON u.id = f.following 
LEFT JOIN posts p2 ON p.source_hash = p2.hash 
LEFT JOIN users u2 ON u2.id = p2.uid 
WHERE (f.user=2 OR p.uid=2) 
GROUP BY p.id 
ORDER BY p.id DESC 

UNION 

SELECT 
     "Product" AS type 
    , NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 
    , name, price 
FROM store_products 
WHERE uid = 2 

应用程序代码可以检查type列,以确定它是否打印PostProduct,并适当地格式化。

+0

完美!这正是我所期待的。谢谢! :) – timgavin 2014-11-08 19:27:38