我的查询应该如何设置?

时间:2017-02-05 21:49:08

标签: mysql sql

我正在为我的俱乐部建立一个网站,其中包含会员列表和发票。我按如下方式设置了我的数据库:

家庭

ID
Family name
Adress
etc.

会员,附有家庭ID

的链接
ID
Firstname
Family_ID

发票,带有指向系列数据库或成员数据库的链接

ID
Amount
payed
Family_ID
Member_ID

有时我想为家庭开具发票,例如年度捐款。但有时我想为会员本身开具发票,以便他们正在比赛。

现在我想制作一个看起来有点像下面的概述页面

Family name1
        Contribution invoice1
    Member1
        Match invoice 1
    member2
        Match invoice 2
Family name2
        Contribution invoice2
    Member1
        Match invoice 3
    member2
        Match invoice 4
etc....

我当然可以通过它们对所有家庭进行查询。并且每行都会查询家庭成员和查询发票。然后再查询每个成员的发票。但我认为应该有一个更复杂的查询来将它们全部放入大查询中。

我希望我的意思很明确,你们可以帮助我。如果有问题,请告诉我。

2 个答案:

答案 0 :(得分:0)

没有演示数据有点难。但是,让我们假设以下方法:首先,我们构建临时inv_combined - 表(作为from - 部分中的选择),它将发票与族和成员组合并分配类型{分别为{1}}和contribution。稍后将使用此member进行排序。然后,给定这个组合表,我们分别添加了家庭和成员的详细信息。最后,我们按type排序,以便结果列出每个家庭的所有捐款发票,然后是所有会员发票。 在您的PHP代码中,您只需浏览列表并注意系列名称,类型和成员名字的任何更改,以启动新的部分。 希望它有所帮助(并希望它有效): - )

family.name, type, member.firstname

答案 1 :(得分:0)

我认为,您需要做的是在主查询中创建一个子查询,以某种分隔符加入这些成员和发票。现在,这看起来像一个非常糟糕的查询,实际上它很复杂,但我在应用程序中的多个位置工作。

null

当我构建它时,我遇到了array_filter值的一些问题,而我只是给了你简单的骨头,尽管我基本上为你的问题重写了整个事情。你需要修改一些foreach数组,以便在最后处理额外的空间,删除所有空字符串(null应该,但只是确定),并处理class ProductViewHolder extends RecyclerView.ViewHolder { ... private Transition transition; ProductViewHolder(CardViewEx view) { super(view); ... transition = TransitionInflater.from(recyclerView.getContext()) .inflateTransition(R.transition.price_button_transition); transition.addTarget(R.id.button_price) .addTarget(R.id.button_add_to_cart_or_customize) .addTarget(R.id.view_price); } void changePriceButton(int titleRes) { TransitionManager.beginDelayedTransition((ViewGroup) itemView, transition); buttonPrice.setVisibility(View.GONE); buttonAddToCartOrCustomize.setVisibility(View.VISIBLE); buttonAddToCartOrCustomize.setText(titleRes); } void resetPriceButton(boolean withTransition) { if (withTransition) { TransitionManager.beginDelayedTransition((ViewGroup) itemView, transition); } buttonPrice.setVisibility(View.VISIBLE); buttonAddToCartOrCustomize.setVisibility(View.GONE); } @OnClick(R.id.button_price) void onPriceClicked() { listener.onProductPriceClicked(product); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ... resetPriceButton(false); } recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); resetPriceButtons(); } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); } } void resetPriceButtons() { int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) { ProductViewHolder holder = (ProductViewHolder) recyclerView.findViewHolderForAdapterPosition(i); if (holder == null || holder.getLayoutPosition() != i) { // inconsistency notifyDataSetChanged(); return; } else { holder.resetPriceButton(true); } } notifyItemRangeChanged(0, firstVisibleItemPosition); notifyItemRangeChanged(lastVisibleItemPosition + 1, getItemCount() - (lastVisibleItemPosition + 1)); } void changePriceButton(long productId, int titleRes) { int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); boolean found = false; for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; i++) { ProductViewHolder holder = (ProductViewHolder) recyclerView.findViewHolderForAdapterPosition(i); if (holder == null || holder.getLayoutPosition() != i) { // inconsistency notifyDataSetChanged(); return; } else if (holder.product.getId() == productId) { holder.changePriceButton(titleRes, true); found = true; } } if (!found) { notifyItemRangeChanged(0, firstVisibleItemPosition); notifyItemRangeChanged(lastVisibleItemPosition + 1, getItemCount() - (lastVisibleItemPosition + 1)); } } 值。

参考以获得更多帮助(我获得此类查询的帮助):MySQL: Nested GROUP_CONCAT